【发布时间】:2015-08-28 20:42:12
【问题描述】:
我正在尝试使用迭代游标的 for 循环在表中插入列。代码是:
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;
jsut 开头的光标获取一个唯一的月份名称列表,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 语句是不现实的。加上基础数据会发生变化,所以我需要能够使用基础数据更改列名。
【问题讨论】:
-
您误用了关系数据库。这些新列应该被规范化,以便月份是表或新表的属性。
-
我知道它们应该是属性,以及为什么,但在这个特殊问题中,我被要求创建一个交叉表报告。所以是的,我知道这并不理想,但必须解决问题。
-
通常不需要更改表的结构来生成特定的报告。您似乎解决了错误的问题。
-
你看过 PIVOT 子句吗?
标签: oracle plsql dynamic-sql