我想在Netteza中修改For循环中的表。我知道Netteza不允许存储过程中的alter table。如前所述:
“这些SQL命令在Netezza存储过程的主体中也是禁止的。”
有没有其他办法可供选择?我是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;发布于 2015-09-02 02:58:14
从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之前,我不知道如何使用存储过程更改表结构。
请注意,在altered的一般情况下(无论是脚本编写的还是手动的),一定要在altered操作之后对每个修改过的表执行新郎操作。
GROOM TABLE tablename VERSIONS;发布于 2015-09-01 23:54:10
您的循环语句是语法正确,但是无法从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我无法想象一个用例,在这种情况下,您希望通过在数据库中调用存储过程来动态地添加列,而数据库之外的存储过程也无法覆盖这些数据。
https://stackoverflow.com/questions/32338152
复制相似问题