2010-10-21 60 views
1

我試圖在下面使用Execute Immediate運行此代碼,但它不工作且值正確。Execute immedite的問題

請建議您輸入正確的密碼。

declare 
v_count number:=1; 
v_conc_name varchar2(400); 
v_val VARCHAR2(20):='vineet'; 
BEGIN 
v_conc_name:='INT_AP_PAY_CONV'; 
EXECUTE IMMEDIATE 'UPDATE xxx_cnc_prg_details 
       SET 
       PARAMETER'||v_count||'=' 
       ||v_val||' where CONCURRENT_PROGRAM_SHORT_NAME= '||v_conc_name; 

end; 
+1

什麼錯誤信息你好嗎? – OmerGertel 2010-10-21 11:54:56

回答

3

看來你錯過了引號:

應該是:

||' where CONCURRENT_PROGRAM_SHORT_NAME= '''||v_conc_name || ''''; 

因爲v_conc_name是VARCHAR2

+0

@OmerGertel,我相信PARAMETER之後的缺失空間是正確的,即代碼生成列名稱PARAMETER1。 – 2010-10-21 12:11:13

5

這是一個更容易(和更好的做法),以使用綁定變量:

declare 
v_count number:=1; 
v_conc_name varchar2(400); 
v_val VARCHAR2(20):='vineet'; 
BEGIN 
v_conc_name:='INT_AP_PAY_CONV'; 
EXECUTE IMMEDIATE 'UPDATE xxx_cnc_prg_details 
       SET 
       PARAMETER'||v_count||'=:bv_val 
       where CONCURRENT_PROGRAM_SHORT_NAME=:bv_conc_name' 
    USING v_val, v_conc_name; 

end; 

使用字符串變量來保存SQL也是一個方便的做法。然後你可以使用DBMS_OUTPUT.PUT_LINE查看和驗證:

declare 
v_count number:=1; 
v_conc_name varchar2(400); 
v_val VARCHAR2(20):='vineet'; 
v_sql LONG; 
BEGIN 
v_conc_name:='INT_AP_PAY_CONV'; 
v_sql := 'UPDATE xxx_cnc_prg_details 
       SET 
       PARAMETER'||v_count||'=:bv_val 
       where CONCURRENT_PROGRAM_SHORT_NAME=:bv_conc_name'; 
EXECUTE IMMEDIATE v_sql USING v_val, v_conc_name; 

end; 
0

我會做這樣的:

DECLARE 
    c   CONSTANT CHAR := ''''; 
    v_conc_name VARCHAR2(400) := 'INT_AP_PAY_CONV'; 
    v_val  VARCHAR2(20) := 'vineet'; 
    v_count  NUMBER  := 1; 
BEGIN 
    EXECUTE IMMEDIATE 'UPDATE xxx_cnc_prg_details 
        SET 
        PARAMETER'||v_count||' = '||c||v_val||c||' 
        where CONCURRENT_PROGRAM_SHORT_NAME = '||c||v_conc_name||c; 

END; 
+0

如果動態部分很長(本例中不是這樣),我更喜歡連接,因爲使用綁定變量維護代碼有點困難。而且我正在做很多Forms代碼,我需要更頻繁地引用char連接。 – 2010-10-22 05:47:02