Declaring a cursor in DB2 with other activity results in failed deployment

StackOverflow https://stackoverflow.com/questions/16203925

  •  11-04-2022
  •  | 
  •  

Domanda

After looking around all over the Internet, I have to come back to SO :).

Summary:

DB2 stored procedure doesn't deploy when 3 lines are uncommented, otherwise it works perfectly fine. Any guesses why? FYI, I am rather new to DB2.

Procedure code:

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

Error:

Deploy TESTDB2.PROC_NAME_GOES_HERE(INTEGER, SMALLINT, DECIMAL(3, 0))

Running

TESTDB2.PROC_NAME_GOES_HERE - Deploy started.

Calling the build utility 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 LOADED FROM - (SYS2.DB2T.DSNEXIT(DSNHDECP))

CONVERT SQLPRINT 4 0OPTIONS USED - SPECIFIED OR DEFAULTED

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 OPTIONS

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 PAGE 2

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

CONVERT SQLPRINT 26 DSNH104I E DSNHPARS LINE 26 COL 10 ILLEGAL SYMBOL "CUR_FFB". SOME SYMBOLS THAT MIGHT BE LEGAL ARE: GLOBAL

CONVERT SQLPRINT 27 1DB2 SQL PRECOMPILER STATISTICS PAGE 3

CONVERT SQLPRINT 28 0SOURCE STATISTICS

CONVERT SQLPRINT 29 SOURCE LINES READ: 32

CONVERT SQLPRINT 30 NUMBER OF SYMBOLS: 14

CONVERT SQLPRINT 31 SYMBOL TABLE BYTES EXCLUDING ATTRIBUTES: 1952

CONVERT SQLPRINT 32 -THERE WERE 2 MESSAGES FOR THIS PROGRAM.

CONVERT SQLPRINT 33 THERE WERE 0 MESSAGES SUPPRESSED BY THE FLAG OPTION.

CONVERT SQLPRINT 34 272544 BYTES OF STORAGE WERE USED BY THE PRECOMPILER.

CONVERT SQLPRINT 35 RETURN CODE IS 8

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

CONVERT SQLTERM 2 DSNH104I E DSNHPARS LINE 26 COL 10 ILLEGAL SYMBOL "CUR_FFB". SOME SYMBOLS THAT MIGHT BE LEGAL ARE: GLOBAL

CONVERT SQLTERM 3 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 S

CONVERT SQLTERM 4 ETS 1 LANGUAGE SQL NOT DETERMINISTIC CALLED ON NULL INPUT FENCED MODIFIES SQL DATA COLLID TESTDB2 WLM ENVIRONMENT TDB2ENV ASUTIME

CONVERT SQLTERM 5 LIMIT 5000000 RUN OPTIONS'NOTEST(NONE,,,*)'P1 : BEGIN DECLARE V_SEQ_NO DECIMAL(3,0); DECLARE V_LVL INT ; DECLARE GLOBAL TEMPORAR

CONVERT SQLTERM 6 Y 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,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 NUMBER OF SYMBOLS: 14

CONVERT SQLTERM 12 SYMBOL TABLE BYTES EXCLUDING ATTRIBUTES: 1952

CONVERT SQLTERM 13 THERE WERE 2 MESSAGES FOR THIS PROGRAM.

CONVERT SQLTERM 14 THERE WERE 0 MESSAGES SUPPRESSED BY THE FLAG OPTION.

CONVERT SQLTERM 15 272544 BYTES OF STORAGE WERE USED BY THE PRECOMPILER.

CONVERT SQLTERM 16 RETURN CODE IS 8

DSNTPSMP CONSOLE 1 * DB2 V9R1 SQL Procedure Processor DSNTPSMP 1.21 (PM09148 2010-03-23)

DSNTPSMP CONSOLE 2 Language conversion warnings and/or errors, rc=8

DSNTPSMP CONSOLE 3 PSM precompile is not successful, cannot continue

DSNTPSMP Summary 1 Request: ALTER_REBUILD routine TESTDB2.PROC_NAME_GOES_HERE did not complete.

Build utility function requested: ALTER_REBUILD

SYSPROC.DSNTPSMP - Returned +8

TESTDB2.PROC_NAME_GOES_HERE - Deploy failed.

TESTDB2.PROC_NAME_GOES_HERE - Roll back completed successfully.

È stato utile?

Soluzione

So finally it worked for me with slight modification, adding a solution for anyone who might come across this confusion later.

Solution - Declare the cursor before you declare the table.

Only thing that still confuses me is how can I create a cursor on an object that doesn't even exist yet.

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top