替代存储过程中的 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;
我想在 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;