2012-08-24 50 views
0

我想在每次運行循環時在表中添加一列。我創建了一個臨時變量,它將爲循環中的每個迭代使用不同的名稱。現在我想在我的表中添加一個具有相同名稱的列。我想是這樣的,部分代碼顯示在Oracle SQL Developer中:如何在名稱存儲在臨時變量中的表中添加列

DECLARE V_COUNT VARCHAR (10) := ZIP_COD 
BEGIN 
ALTER TABLE ABCD 
ADD V_COUNT varchar(10); 

update ABCD b 
set b.V_COUNT = (select d.ZIP_cod 
from ORA_DMSTORE d 
where b.id_dmstore = d.id_dmstore); 
END; 

這是顯示錯誤「通常一個PL/SQL編譯錯誤。」 我不知道如何擺脫它。請幫助

+0

什麼數據庫產品是您使用? – kgrittn

+0

我在oracle數據庫上做的 – user1617511

+0

你爲什麼要這樣做?這聽起來像一個可怕的模型。您必須使用動態SQL來執行此操作,並且您需要查詢這些值。爲什麼不有一個單獨的表來保存值;或者只是加入到'ora_dmstore'中,因爲您似乎已經有了'id'值來加入?如果你的目標隱藏了「複雜性」,你可以有這樣的觀點。 –

回答

1

首先,你不能在PL/SQL做ALTER TABLE ..,你必須使用dbms_sqlexecute immediate

和列名不能以數字開頭,所以你需要某種形式的前綴,n在我的例子中。

所以,一個可能的解決方案是:

DECLARE 
V_COUNT VARCHAR (10) := ZIP_COD; 
BEGIN 
EXECUTE IMMEDIATE 'ALTER TABLE ABCD ADD (n'||V_COUNT||' varchar(10))'; 

EXECUTE IMMEDIATE ' 
update ABCD b 
    set b.n'||V_COUNT||' = (select d.ZIP_cod 
          from ORA_DMSTORE d 
          where b.id_dmstore = d.id_dmstore) 
'; 
END; 
/
+0

如果要在新列中添加的值存儲在臨時變量中,該怎麼辦?我會用它作爲 更新ABCD b set b.n'|| V_COUNT ||' = || temp_variable || – user1617511

+0

或多或少,你錯過了一個報價:'set b.n'|| V_COUNT ||' ='|| temp_variable'並且處理'temp_variable'的類型轉換(即日期到char或類似的情況,在這種情況下最好使用綁定變量:'set b.n'|| V_COUNT || =:temp_variable'using temp_variable ' – GWu

相關問題