Netteza SQL ALTER TABLE在存储过程中的替代方案?

时间:2015-09-01 18:02:39

标签: sql stored-procedures netezza

我想在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;

2 个答案:

答案 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

我无法想象一个用例,您希望通过从数据库中调用存储过程来动态添加列,而这些存储过程在数据库之外也无法实现。