首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >存储过程选择中的Netteza SQL alternative?

存储过程选择中的Netteza SQL alternative?
EN

Stack Overflow用户
提问于 2015-09-01 18:02:38
回答 2查看 814关注 0票数 1

我想在Netteza中修改For循环中的表。我知道Netteza不允许存储过程中的alter table。如前所述:

“这些SQL命令在Netezza存储过程的主体中也是禁止的。”

有没有其他办法可供选择?我是Netteza的初学者。我也不知道我的循环格式是否正确?

代码语言:javascript
复制
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;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-02 02:58:14

从v7.1开始,您可以在存储过程中声明AUTOCOMMIT ON块,在这个块中,您可以调用存储过程中禁止的语句。

代码语言:javascript
复制
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之前,我不知道如何使用存储过程更改表结构。

请注意,在altered的一般情况下(无论是脚本编写的还是手动的),一定要在altered操作之后对每个修改过的表执行新郎操作。

代码语言:javascript
复制
GROOM TABLE tablename VERSIONS;
票数 1
EN

Stack Overflow用户

发布于 2015-09-01 23:54:10

您的循环语句是语法正确,但是无法从nzplsql中发出alter语句。

我建议使用bash脚本作为替代,反复调用nzsql

代码语言:javascript
复制
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

我无法想象一个用例,在这种情况下,您希望通过在数据库中调用存储过程来动态地添加列,而数据库之外的存储过程也无法覆盖这些数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32338152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档