使用execute Immediate插入一行

时间:2013-04-06 18:13:00

标签: plsql oracle11g

由于引号,下面的pl / sql显示错误。你能帮忙吗?你可以给我一些如何编写这类查询的提示。

DECLARE 
v_RULE_NAME VARCHAR2(200):='ABC';
v_user_id NUMBER:=2;
begin
execute immediate 'INSERT INTO BW_TXS 
                 VALUES ('||TXN_ID.NEXTVAL||','||v_user_id||','
                         ||SYSDATE||',''super '''||v_RULE_NAME
                         ||',''super '''||v_RULE_NAME||')';

end;

由于

3 个答案:

答案 0 :(得分:2)

应该是这样的:

DECLARE 
v_RULE_NAME VARCHAR2(200):='ABC';
v_user_id NUMBER:=2;
begin
execute immediate 'INSERT INTO BW_TXS 
                 VALUES (TXN_ID.NEXTVAL,'||v_user_id||',SYSDATE,''super '||v_RULE_NAME
                         ||''',''super '||v_RULE_NAME||''')';

end;
/

但请注意,在使用动态SQL时,请使用绑定变量(在这种简单的情况下,动态SQL总是过度杀伤)。即。

DECLARE 
v_RULE_NAME VARCHAR2(200):='ABC';
v_user_id NUMBER:=2;
begin
execute immediate 'INSERT INTO BW_TXS 
                 VALUES (TXN_ID.NEXTVAL,:userid,SYSDATE,:rule, :rule)'
 using v_user_id, 'super ' || v_rule_name, 'super ' || v_rule_name;

end;
/

(不确定为什么两列中有相同的字符串)。在这个简单的情况下没有动态SQL是可能的:

DECLARE 
v_RULE_NAME VARCHAR2(200):='ABC';
v_user_id NUMBER:=2;
begin
  INSERT INTO BW_TXS 
  VALUES (TXN_ID.NEXTVAL,v_user_id,SYSDATE, 'super ' || v_rule_name, 
          'super ' || v_rule_name);

end;
/

您也应该始终在插件中定义列名称,例如insert into bw_txt (a, b, c, d..) values (...),就好像有人在以后添加了一个默认值的列,您的代码就会中断。

答案 1 :(得分:0)

无需立即执行。这是PL / SQL的好处之一,插入,更新和删除等持久性操作非常简单。

DECLARE 
v_RULE_NAME VARCHAR2(200):='ABC';
v_user_id NUMBER:=2; 

begin 

insert into BW_TXS VALUES(TXN_ID.NEXTVAL, v_user_id, SYSDATE, 'super', 'super', v_RULE_NAME);

答案 2 :(得分:0)

我不知道为什么,但我发现我必须在一个区块中包裹,否则我只会收到bizaare错误消息:

execute immediate '
  begin 
          insert into something.SomethingElse (...)
          values (SYSDATE,''1.58.0.0'',''f1a87dfbe1ba'',1,null);
  end;';

我的错误信息是:

Error report:
ORA-00933: SQL command not properly ended
ORA-06512: at line 14
00933. 00000 -  "SQL command not properly ended"