在DB2中使用其他活动声明游标会导致部署失败

时间:2013-04-24 23:24:58

标签: db2 zos

在浏览了整个互联网后,我必须回到SO:)。

要点:

当3行被取消注释时,DB2存储过程不会部署,否则它可以正常工作。任何猜测为什么?仅供参考,我是DB2的新手。

程序代码:

CREATE PROCEDURE TESTDB2.PROC_NAME_GOES_HERE(
    IN  P_ID INT ,
    IN  P_SEQ_NO_2 SMALLINT,
    IN  P_SEQ_NO DECIMAL(3,0))

    RESULT SETS 1
    LANGUAGE SQL
    NOT DETERMINISTIC
    CALLED ON NULL INPUT
    FENCED
    MODIFIES SQL DATA
    COLLID TESTDB2
    WLM ENVIRONMENT TDB2ENV
    ASUTIME LIMIT 5000000
    RUN OPTIONS 'NOTEST(NONE,*,*,*)' 
P1: BEGIN

    DECLARE V_SEQ_NO DECIMAL(3,0);
    DECLARE V_LVL INT;

    DECLARE GLOBAL TEMPORARY TABLE SESSION.SEQ_NO_TABLE
    (LVL INT NOT NULL, SEQ_NO DECIMAL(3,0) NOT NULL);

    SET V_LVL = 0;

    INSERT INTO SESSION.SEQ_NO_TABLE(LVL, SEQ_NO)
    VALUES(V_LVL, P_SEQ_NO);

    --**************************************************--
    --  If I uncomment following 3 lines, deployment fails --

    --DECLARE CUR_FFB CURSOR WITH RETURN FOR
    --SELECT * FROM SESSION.SEQ_NO_TABLE;
    --OPEN CUR_FFB;

END P1

错误:

  

部署TESTDB2.PROC_NAME_GOES_HERE(INTEGER,SMALLINT,DECIMAL(3,0))

     

运行

     

TESTDB2.PROC_NAME_GOES_HERE - 部署已开始。

     

调用构建实用程序SYSPROC.DSNTPSMP ...

     

CONVERT SQLPRINT 1 1DB2 SQL PRECOMPILER VERSION 9 REL。 1.0 PAGE 1

     

CONVERT SQLPRINT 2 0OPTIONS SPECIFIED:STDSQL(NO)NEWFUN(YES)HOST(SQL)ONEPASS MAR(1,80)CCSID(37)

     

CONVERT SQLPRINT 3 DSNHDECP加载 - (SYS2.DB2T.DSNEXIT(DSNHDECP))

     

转换SQLPRINT 4使用的选项 - 指定或默认

     

CONVERT SQLPRINT 5 APOST

     

CONVERT SQLPRINT 6 APOSTSQL

     

CONVERT SQLPRINT 7 ATTACH(TSO)

     

CONVERT SQLPRINT 8 CCSID(37)

     

CONVERT SQLPRINT 9 NOPADNTSTR

     

CONVERT SQLPRINT 10 CONNECT(2)

     

CONVERT SQLPRINT 11 DEC(15)

     

CONVERT SQLPRINT 12 FLAG(I)

     

CONVERT SQLPRINT 13 HOST(SQL)

     

CONVERT SQLPRINT 14 LINECOUNT(60)

     

CONVERT SQLPRINT 15 MARGINS(1,80)

     

CONVERT SQLPRINT 16 NEWFUN(YES)

     

CONVERT SQLPRINT 17 ONEPASS

     

CONVERT SQLPRINT 18选项

     

CONVERT SQLPRINT 19 PERIOD

     

CONVERT SQLPRINT 20 NOSOURCE

     

CONVERT SQLPRINT 21 STDSQL(NO)

     

CONVERT SQLPRINT 22 SQL(DB2)

     

CONVERT SQLPRINT 23 NOXREF

     

CONVERT SQLPRINT 24 1DB2 SQL PRECOMPILER MESSAGES第2页

     

CONVERT SQLPRINT 25 0DSNH016I E DSNHPARS LINE 26 COL 10" GLOBAL"需要

     

CONVERT SQLPRINT 26 DSNH104I E DSNHPARS LINE 26 COL 10 ILLEGAL SYMBOL" CUR_FFB"。一些可能是法律的符号是:全球

     

CONVERT SQLPRINT 27 1DB2 SQL PRECOMPILER STATISTICS第3页

     

CONVERT SQLPRINT 28 0SOURCE STATISTICS

     

CONVERT SQLPRINT 29 SOURCE LINES READ:32

     

CONVERT SQLPRINT 30符号数:14

     

CONVERT SQLPRINT 31符号表字节排除属性:1952

     

CONVERT SQLPRINT 32 -THER有2个本程序的消息。

     

CONVERT SQLPRINT 33标志选项所支持的消息是0。

     

CONVERT SQLPRINT 34 272544预先存储器使用的存储字节。

     

CONVERT SQLPRINT 35返回代码是8

     

CONVERT SQLTERM 1 DSNH016I E DSNHPARS LINE 26 COL 10" GLOBAL"需要

     

CONVERT SQLTERM 2 DSNH104I E DSNHPARS LINE 26 COL 10 ILLEGAL SYMBOL" CUR_FFB"。一些可能是法律的符号是:全球

     

CONVERT SQLTERM 3创建过程TESTDB2.PROC_NAME_GOES_HERE(在P_ID INT中,在P_SEQ_NO_2 SMALLINT中,在P_SEQ_NO DECIMAL(3,0)中)结果S

     

CONVERT SQLTERM 4 ETS 1 LANGUAGE SQL NOT DETERMINISTIC调用NULL输入FENCED MODIFIES SQL DATA COLLID TESTDB2 WLM环境TDB2ENV ASUTIME

     

CONVERT SQLTERM 5 LIMIT 5000000 RUN OPTIONS&NOTTS(NOT,,*)' P1:BEGIN DECLARE V_SEQ_NO DECIMAL(3,0); DECLARE V_LVL INT;宣布全球时间

     

CONVERT SQLTERM 6 Y TABLE SESSION.SEQ_NO_TABLE(LVL INT NOT NULL,SEQ_NO DECIMAL(3,0)NOT NULL); SET V_LVL = 0;插入SESSION.SEQ_NO_TABLE(LVL,S

     

CONVERT SQLTERM 7 EQ_NO)VALUES(V_LVL,P_SEQ_NO); DECLARE CUR_FFB

     

CONVERT SQLTERM 8

     

CONVERT SQLTERM 9 SOURCE STATISTICS

     

CONVERT SQLTERM 10 SOURCE LINES READ:32

     

CONVERT SQLTERM 11符号数:14

     

CONVERT SQLTERM 12符号表字节排除属性:1952

     

CONVERT SQLTERM 13这个程序有2个消息。

     

CONVERT SQLTERM 14标志选项压缩了0条消息。

     

CONVERT SQLTERM 15 272544 PRICOMPILER使用的存储文件。

     

CONVERT SQLTERM 16返回代码是8

     

DSNTPSMP控制台1 * DB2 V9R1 SQL过程处理器DSNTPSMP 1.21(PM09148 2010-03-23)

     

DSNTPSMP CONSOLE 2语言转换警告和/或错误,rc = 8

     

DSNTPSMP CONSOLE 3 PSM预编译不成功,无法继续

     

DSNTPSMP摘要1请求:ALTER_REBUILD例程TESTDB2.PROC_NAME_GOES_HERE未完成。

     

请求构建实用程序功能:ALTER_REBUILD

     

SYSPROC.DSNTPSMP - 返回+8

     

TESTDB2.PROC_NAME_GOES_HERE - 部署失败。

     

TESTDB2.PROC_NAME_GOES_HERE - 回滚成功完成。

1 个答案:

答案 0 :(得分:0)

所以最后它对我有所改变,稍作修改,为后来可能会遇到这种困惑的人添加一个解决方案。

解决方案 - 在声明表格之前声明游标。

只有让我感到困惑的是如何在一个甚至还不存在的对象上创建游标。

CREATE PROCEDURE TESTDB2.PROC_NAME_GOES_HERE(
IN  P_ID INT ,
IN  P_SEQ_NO_2 SMALLINT,
IN  P_SEQ_NO DECIMAL(3,0))

RESULT SETS 1
LANGUAGE SQL
NOT DETERMINISTIC
CALLED ON NULL INPUT
FENCED
MODIFIES SQL DATA
COLLID TESTDB2
WLM ENVIRONMENT TDB2ENV
ASUTIME LIMIT 5000000
RUN OPTIONS 'NOTEST(NONE,*,*,*)' 
P1: BEGIN

    DECLARE V_SEQ_NO DECIMAL(3,0);
    DECLARE V_LVL INT;

    DECLARE CUR_FFB CURSOR WITH RETURN FOR
    SELECT * FROM SESSION.SEQ_NO_TABLE;

    DECLARE GLOBAL TEMPORARY TABLE SESSION.SEQ_NO_TABLE
    (LVL INT NOT NULL, SEQ_NO DECIMAL(3,0) NOT NULL);

    SET V_LVL = 0;

    INSERT INTO SESSION.SEQ_NO_TABLE(LVL, SEQ_NO)
    VALUES(V_LVL, P_SEQ_NO);

    OPEN CUR_FFB;

END P1