Plsql 使用executeimmediate插入一行

Plsql 使用executeimmediate插入一行,plsql,oracle11g,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

下面的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;

谢谢

不需要立即执行。这是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);
应该是这样的:

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完全是多余的)。i、 e

(不确定为什么两列中有相同的字符串)。在这种简单的情况下,如果没有动态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中定义列名,如
插入bw_txt(a,b,c,d…)值(…)
,就好像有人稍后添加了一个带有默认值的列,您的代码将中断一样。

我不知道为什么,但我发现我必须在块中换行,否则我只收到了一些错误消息:

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"

是的!执行成功。非常感谢。可以使用绑定变量重写查询吗。你能解释一下绑定变量的用途吗。因为我需要将代码从sql server迁移到oracle,但我对oracle世界还是新手。需要帮助。@user1990383上面显示的是绑定的。使用绑定变量(a)可防止sql注入攻击(b)可防止使用类似的sql语句淹没共享池[即,它们可提高性能并防止可能的共享池内存错误](c)可减少由于过度硬解析而导致的机箱CPU负载。除非需要,否则不要使用动态SQL(静态SQL速度更快,在使用静态SQL时您不必担心绑定变量OK,谢谢您的回答。真的,我很想知道,因为知道我的人总是在我身后,但不知道您正在帮助的人,他们对帮助不感兴趣。上帝保佑您。删除符号“;”刑满
Error report:
ORA-00933: SQL command not properly ended
ORA-06512: at line 14
00933. 00000 -  "SQL command not properly ended"