我正在嘗試使用循環遍歷遊標的循環在表中插入列。該代碼是:Alter Table在PL SQL循環中添加列
declare
cursor Months_ET is
SELECT distinct to_char(FEE_CD_ACT_SUM_ACCTG_DA, 'MON-YY') as "Month_U"
FROM EXPORT_TABLE
WHERE EXPORT_TABLE.FEE_CD_ACT_SUM_ACCTG_DA >= to_date('10/01/2013','mm/dd/yyyy')
AND EXPORT_TABLE.FEE_CD_ACT_SUM_ACCTG_DA < to_date('10/01/2014', 'mm/dd/yyyy');
n integer := 1;
begin
for mon in Months_ET loop
dbms_output.put_line(mon."Month_U");
execute immediate 'Alter table "Fee_CT" add('|| mon."Month_U" ||' varchar(20))';
n := n +1;
end loop;
end;
在開始光標僅僅指剛得到的唯一月份名稱將DBMS_OUTPUT.PUT_LINE打印出的清單:
SEP-14
AUG-14
JUL-14
所以我知道的變量是不是空的。
因此,使用這些結果我想爲每個月添加三列。但是,我得到一個無效的數據類型錯誤。我也試圖改變for循環來連接這樣的報價之外的表名:
for mon in Months_ET loop
--Month_List(n) := mon."Month_U";
dbms_output.put_line(mon."Month_U");
execute immediate 'Alter table' ||"Fee_CT" || 'add('|| mon."Month_U" ||' varchar(20))';
n := n +1;
,但我得到的信息是「表,視圖或序列參考‘Fee_CT’在此背景下允許的。 「不知道我做錯了什麼。實際數據要大得多,涵蓋更廣泛的時間範圍,因此使用多個alter table語句並不現實。加上底層的數據將會發生變化,所以我需要能夠使用底層數據更改列名。
您正在濫用關係數據庫。這些新列應該進行標準化,以便該月是表格的屬性或新表格的屬性。 –
我明白他們應該是屬性,爲什麼,但在這個特定問題中,我被要求創建一個交叉表報告。所以是的,我知道這並不理想,但必須解決問題。 – user2907249
通常不需要更改表結構來生成特定的報表。看來你正在解決錯誤的問題。 – APC