2013-04-06 78 views
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; 

感謝

回答

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); 
+0

您的查詢得到錯誤 – user1990383 2013-04-06 18:23:16

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 (...)定義的列名,如果有人將一列用默認值後,你的代碼將打破。

+0

耶!取得成功。謝謝。你可以用綁定變量重寫查詢嗎?你能解釋一下綁定變量的用法嗎?因爲我需要將代碼從sql server遷移到oracle,但我對oracle世界很陌生。需要幫忙。 – user1990383 2013-04-06 18:26:08

+0

@ user1990383上面顯示了綁定的綁定。使用綁定變量(一)防止SQL注入攻擊(二)防止你有類似的SQL語句充斥你的共享池[即它們可以提高性能並防止可能的共享池內存錯誤](c)由於過度硬解析而導致CPU上的CPU負載減少。除非你需要不要使用動態SQL(靜態SQL更快,你不必使用靜態SQL – DazzaL 2013-04-06 18:27:35

+0

好時擔心綁定變量,謝謝您的答覆。說真的,我不知道是因爲誰知道我總是在後面的人我沒有表現出幫助的興趣,但卻不知道你在幫助的人,上帝保佑你。 – user1990383 2013-04-06 18:34:11

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"