Netezza SQL ALTER TABLE 在存储过程中的替代方案?
Posted
技术标签:
【中文标题】Netezza SQL ALTER TABLE 在存储过程中的替代方案?【英文标题】:Netteza SQL ALTER TABLE in stored procedure alternative? 【发布时间】:2015-09-01 18:02:38 【问题描述】:我想在 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;
【问题讨论】:
【参考方案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;
【讨论】:
哦,很好。这给了我一个远离 7.0.4 的充分理由。【参考方案2】:您的循环语句是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
我真的无法想象一个用例,您希望通过从数据库中调用存储过程来动态添加列,而在数据库之外执行它也无法覆盖。
【讨论】:
谢谢,它有帮助。即使另一个答案更方便。 这是我们的用例。我们有一个数据库升级脚本,可以从我们的软件的一个版本升级到另一个版本,而且它恰好是作为单个 SQL 文件编写的。限制之一是我们有一个可以多次执行而不会引发任何错误的文件。为此,我们必须创建名为 CREATE_TABLE_IF_NOT_EXISTS()、ADD_COLUMN_IF_NOT_EXISTS() 和 RENAME_COLUMN_IF_EXISTS() 的存储过程。它变得比我们预期的要复杂一些,我们最好编写一个批处理文件(Windows 应用程序)或一些混合文件,但我们确实有一个用例。 对,我明白,但正如我所提到的,我无法想象你需要这样做的情况在数据库中你也不能这样做在它之外。这些任务中的大多数都不是某些用户需要访问它的事情。我的观点是脚本环境是功能的超集。这 ^ 听起来也很可怕。检查是否存在并通知/抛出错误比静默修复要好得多,尤其是在执行升级时。以上是关于Netezza SQL ALTER TABLE 在存储过程中的替代方案?的主要内容,如果未能解决你的问题,请参考以下文章
sql [ALTER TABLE]要(1)添加,删除或修改列,或(2)在现有表中添加和删除各种约束。 #Syntax #Alter_table
sql ALTER TABLE if列不存在。来自http://stackoverflow.com/questions/24571611/mysql-alter-table-if-column-not