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