我想在Netteza SQL中的For
循环中更改表。我知道Netteza在存储过程中不允许alter table
。引用:
"在Netezza存储过程的主体内也禁止使用这些SQL命令。"
这样做有其他选择吗?我是Netteza的初学者。我也不知道我的循环格式是否正确?
CREATE OR REPLACE PROCEDURE "SP_Automate_Table"()
RETURNS INTEGER
LANGUAGE NZPLSQL AS
BEGIN_PROC
DECLARE
vSQL1 varchar(30000) ;
BEGIN
FOR i in 2011..2014
LOOP
For j in 1..12
Loop
call "SP_Count"(i, j);
vSQL1:='alter table X add columnX INT';
....
...
..
EXECUTE immediate vSQL1;
END LOOP;
END LOOP;
END;
END_PROC;
答案 0 :(得分:1)
从v7.1开始,您可以在存储过程中声明AUTOCOMMIT ON块,在此块中,您可以调用在存储过程中禁止的语句。
CREATE OR REPLACE PROCEDURE ADMIN.SP_ALTER_LOOP(INTEGER, INTEGER)
RETURNS INTEGER
LANGUAGE NZPLSQL AS
BEGIN_PROC
DECLARE
pStartVal ALIAS FOR $1;
pCount ALIAS FOR $2;
vSQL varchar(30000);
BEGIN
BEGIN AUTOCOMMIT ON
for i in 1 .. pCount LOOP
vSQL := 'ALTER TABLE CLAIM_' || pStartVal + i-1 || ' ADD COLUMN (COL2 BIGINT);';
EXECUTE IMMEDIATE vSQL;
END LOOP;
END;
END;
END_PROC;
在v7.1之前,我不知道如何通过存储过程改变表结构。
请注意,在ALTER TABLE的一般情况下(无论是使用此脚本还是手动编写脚本),请确保在ALTER操作后对每个已更改的表执行修饰。
GROOM TABLE tablename VERSIONS;
答案 1 :(得分:0)
你的循环语句是syntactically correct,但是没有办法从nzplsql中发出alter语句。
我建议做一个bash脚本作为替代方案,反复调用nzsql
。
for i in $(seq 2011 2014); do
for j in $(seq 1 12); do
nzsql -c "call \"SP_Count\"($i, $j);"
nzsql -c "alter table X add columnX INT;"
done
done
我无法想象一个用例,您希望通过从数据库中调用存储过程来动态添加列,而这些存储过程在数据库之外也无法实现。