在浏览了整个互联网后,我必须回到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 - 回滚成功完成。
答案 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