1

由于引号,下面的 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;

谢谢

4

3 回答 3

3

它应该是这样的:

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

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 (...)稍后有人添加具有默认值的列一样,您的代码将中断。

于 2013-04-06T18:19:19.083 回答
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);
于 2013-04-06T18:19:01.157 回答
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"
于 2014-07-08T11:57:41.203 回答