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 语句

sql ALTER TABLE if列不存在。来自http://stackoverflow.com/questions/24571611/mysql-alter-table-if-column-not

SQL-W3School-高级:SQL ALTER TABLE 语句

SQL ALTER TABLE 语句在项目中的使用

SQL ALTER TABLE 语句在项目中的使用