在DB2中与其他活动一起声明游标会导致部署失败

在DB2中与其他活动一起声明游标会导致部署失败,db2,zos,Db2,Zos,在浏览了所有的互联网之后,我不得不回到原来的状态 总结: 当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

在浏览了所有的互联网之后,我不得不回到原来的状态

总结:

当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\u NAME\u GOES\u here整数,SMALLINT,小数点3,0

运行

TESTDB2.PROC_NAME_转到这里-部署已启动

正在调用生成实用程序SYSPROC.DSNTPSMP

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

转换SQLPRINT 2 0指定的选项:STDSQLNO NEWFUNYES HOSTSQL ONEPASS MAR1,80 CCSID37

转换从-SYS2.DB2T.DSNEXITDSNHDECP加载的SQLPRINT 3 DSNHDECP

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

转换SQLPRINT 5 APAST

将SQLPRINT 6转换为SQL

转换SQLPRINT 7 ATTACHTSO

转换SQLPRINT 8 CCSID37

转换SQLPRINT 9 NOPADNTSR

转换SQLPRINT 10连接2

转换SQLPRINT 11 DEC15

转换SQLPRINT 12 FLAGI

转换SQLPRINT 13 HOSTSQL

转换SQLPRINT 14行计数60

转换SQLPRINT 15页边距1,80

转换SQLPRINT 16 NEWFUNYES

转换SQLPRINT 17 ONEPASS

转换SQLPRINT 18选项

转换SQLPRINT 19期间

转换SQLPRINT 20 NOSOURCE

转换SQLPRINT 21 STDSQLNO

将SQLPRINT转换为SQLDB2

转换SQLPRINT 23 NOXREF

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

需要转换SQLPRINT 25 0DSNH016I E DSNHPAR第26行第10列全局

转换SQLPRINT 26 DSNH104I E DSNHPAR行26列10非法符号CUR_FFB。一些可能合法的符号是:全局

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

转换SQLPRINT 28 0源统计信息

将SQLPRINT 29源行转换为:32

转换SQLPRINT 30符号数:14

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

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

CONVERT SQLPRINT 33标记选项抑制了0条消息

CONVERT SQLPRINT 34预编译器使用了272544字节的存储空间

CONVERT SQLPRINT 35返回代码为8

需要转换SQLTERM 1 DSNH016I E DSNHPAR第26行第10列全局

转换SQLTERM 2 DSNH104I E DSNHPAR第26行第10列非法符号CUR_FFB。一些可能合法的符号是:全局

转换SQLTERM 3创建过程TESTDB2.PROC_NAME_GOES_此处p_ID INT,p_SEQ_NO_2 SMALLINT,p_SEQ_NO DECIMAL3,0RESULT S

CONVERT SQLTERM 4 ETS 1语言在空输入上调用SQL NOT DETERMINISTIC FENCED MODIFIES SQL DATA COLLID TESTDB2 WLM ENVIRONMENT TDB2ENV ASUTIME

转换SQLTERM 5 LIMIT 5000000运行选项'NOTESTNONE,,,*'P1:BEGIN DECLARE V_SEQ_NO DECIMAL3,0;声明V_LVL INT;声明全局临时

转换SQLTERM 6 Y TABLE SESSION.SEQ_NO_TABLELVL INT NOT NULL,SEQ_NO DECIMAL3,0 NOT NULL;设置V_LVL=0;插入会话。序号表

转换SQLTERM 7 EQ_NOVALUESV_LVL,p_序号;声明当前FFB

转换SQLTERM 8

转换SQLTERM 9源统计信息

将SQLTERM 10源代码行转换为:32

转换SQLTERM 11符号数:14

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

CONVERT SQLTERM 13此程序有2条消息

CONVERT SQLTERM 14标志选项抑制了0条消息

CONVERT SQLTERM 15预编译器使用了272544字节的存储空间

CONVERT SQLTERM 16返回代码为8

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

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

DSNTPSMP控制台3 PSM预编译未成功,无法继续

DSNTPSMP摘要1请求:ALTER_REBUILD例程TESTDB2.PROC_NAME_GOES_此处未完成

请求的生成实用程序函数:ALTER\U REBUILD

SYSPROC.DSNTPSMP-返回+8

TESTDB2.PROC_NAME_转到这里-部署失败

TESTDB2.PROC_NAME_转到这里-回滚comp 删除成功


因此,最后它对我起了作用,只是做了一些小小的修改,为以后可能遇到这种困惑的任何人添加了一个解决方案

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

唯一让我困惑的是,我如何在一个甚至还不存在的对象上创建光标

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