1

在互联网上环顾四周之后,我不得不回到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...

转换 SQLPRINT 1 1DB2 SQL 预编译器版本 9 REL。1.0 页 1

转换 SQLPRINT 2 0 指定选项:STDSQL(NO) NEWFUN(YES) HOST(SQL) ONEPASS MAR(1,80) CCSID(37)

转换 SQLPRINT 3 DSNHDECP 加载自 - (SYS2.DB2T.DSNEXIT(DSNHDECP))

CONVERT SQLPRINT 4 0 使用的选项 - 指定或默认

转换 SQLPRINT 5 APOST

转换 SQLPRINT 6 APOSTSQL

转换 SQLPRINT 7 附加(TSO)

转换 SQLPRINT 8 CCSID(37)

转换 SQLPRINT 9 NOPADNTSTR

转换 SQLPRINT 10 连接 (2)

转换 SQLPRINT 12 月 11 日(15)

转换 SQLPRINT 12 标志 (I)

转换 SQLPRINT 13 主机(SQL)

转换 SQLPRINT 14 LINECOUNT(60)

转换 SQLPRINT 15 MARGINS(1,80)

转换 SQLPRINT 16 NEWFUN(是)

转换 SQLPRINT 17 ONEPASS

转换 SQLPRINT 18 选项

转换 SQLPRINT 19 期间

转换 SQLPRINT 20 NOSOURCE

转换 SQLPRINT 21 STDSQL(否)

转换 SQLPRINT 22 SQL(DB2)

转换 SQLPRINT 23 NOXREF

转换 SQLPRINT 24 1DB2 SQL 预编译器消息第 2 页

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

转换 SQLPRINT 26 DSNH104I E DSNHPARS LINE 26 COL 10 非法符号“CUR_FFB”。一些可能是合法的符号是:全球

转换 SQLPRINT 27 1DB2 SQL 预编译器统计信息第 3 页

转换 SQLPRINT 28 0SOURCE 统计信息

CONVERT SQLPRINT 29 读取的源行:32

转换 SQLPRINT 30 符号数:14

转换 SQLPRINT 31 符号表字节,不包括属性:1952

转换 SQLPRINT 32 - 该程序有 2 条消息。

CONVERT SQLPRINT 33 有 0 条消息被标志选项抑制。

CONVERT SQLPRINT 34 272544 字节的存储已被预编译器使用。

转换 SQLPRINT 35 返回代码为 8

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

转换 SQLTERM 2 DSNH104I E DSNHPARS LINE 26 COL 10 非法符号“CUR_FFB”。一些可能是合法的符号是:全球

转换 SQLTERM 3 创建过程 TESTDB2.PROC_NAME_GOES_HERE(IN P_ID INT,IN P_SEQ_NO_2 SMALLINT,IN P_SEQ_NO DECIMAL(3,0))RESULT S

CONVERT SQLTERM 4 ETS 1 LANGUAGE SQL NOT DETERMINISTIC CALLED ON NULL Input Fenced 修改 SQL 数据冲突 TESTDB2 WLM 环境 TDB2ENV ASUTIME

CONVERT SQLTERM 5 LIMIT 5000000 RUN OPTIONS'NOTEST(NONE, , ,*)'P1 : BEGIN DECLARE V_SEQ_NO DECIMAL(3,0); 声明 V_LVL INT ; 宣布全球临时

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

转换 SQLTERM 7 EQ_NO)VALUES(V_LVL,P_SEQ_NO); 声明 CUR_FFB

转换 SQLTERM 8

转换 SQLTERM 9 源统计信息

CONVERT SQLTERM 10 SOURCE LINES READ: 32

转换 SQLTERM 11 符号数:14

转换 SQLTERM 12 符号表字节,不包括属性:1952

转换 SQLTERM 13 此程序有 2 条消息。

转换 SQLTERM 14 有 0 条消息被标志选项抑制。

CONVERT SQLTERM 15 272544 字节的存储被预编译器使用。

转换 SQLTERM 16 返回代码为 8

DSNTPSMP CONSOLE 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 - 回滚成功完成。

4

1 回答 1

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
于 2013-04-25T19:07:02.700 回答