2010-08-21 45 views
4

我的動態sql下面改變一個表&根據查詢的輸出創建列給出錯誤。光標內的動態SQL

查詢:

DECLARE 
    CURSOR c1 is select distinct WP_NO from temp; 
    cnum VARCHAR2(255); 

BEGIN 

    FOR cnum in c1 
    LOOP 
    EXECUTE IMMEDIATE 'Alter table temp_col add (:1 varchar2(255))' using cnum; 
    END LOOP; 

    COMMIT; 

END; 

錯誤:

PLS-00457:表達式必須是SQL類型的

回答

4

這是發生,因爲bind variables are not allowed in DDL statements

考慮嘗試它不使用綁定變量:

DECLARE 
    CURSOR c1 is select distinct WP_NO from temp; 
    cnum VARCHAR2(255); 
BEGIN 
    FOR cnum in c1 
    LOOP 
    EXECUTE IMMEDIATE 'Alter table temp_col add ('|| cnum ||' varchar2(255))'; 
    END LOOP; 

    COMMIT; 
END; 
+1

正好。綁定變量在任何地方都是不允許的。 – 2010-08-21 22:58:05

+2

根據'temp.WP_NO'又名'cnum'的來源,您可能需要對其進行清理以防止SQL注入攻擊。 – 2010-08-22 06:48:22

-1

你必須與CNUM符號,它同時使用一個局部變量和遊標的當前行的衝突。

你可能想這樣的:

DECLARE 
    CURSOR c1 is select distinct WP_NO from temp; 

BEGIN 

    FOR current_row in c1 
    LOOP 
    EXECUTE IMMEDIATE 'Alter table temp_col add (:1 varchar2(255))' using current_row.WP_NO; 
    END LOOP; 

    COMMIT; 

END; 

正如你所看到的,你並不需要聲明的是您在使用for循環CURRENT_ROW變量。

+0

綁定變量不能在這裏使用。 – 2010-08-23 04:53:19

+0

這兩個答案都不起作用(儘管OMG小馬對綁定變量是正確的)。正確的解決方案是: 開始 對於x在循環 (從臨時選擇不同WP_NO )執行的立即改變表temp_col添加'|| x.wp_no || 'varchar2(255)'; END LOOP; END; – Sam 2010-09-01 16:27:07