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

Netteza SQL ALTER TABLE in stored procedure alternative?

我想在 Netteza SQL 的 For 循环中更改 table。我知道 Netteza 不允许在存储过程中使用 alter table。如引用:

"These SQL commands are also prohibited within the body of a Netezza stored procedure."

是否有其他替代方法?我是 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;

您的循环语句是 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

我真的无法想象这样一个用例:您希望通过从数据库内调用存储过程来动态添加列,而在数据库外执行此操作也无法覆盖。

从 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 ;
    pCount ALIAS FOR ;    
    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 之前,我不知道有什么方法可以使用存储过程更改 table 结构。

请注意,在 ALTER TABLE 的一般情况下(无论是像这样编写脚本还是手动),请务必在 ALTER 操作后对每个更改的 table 执行修饰。

GROOM TABLE tablename VERSIONS;