Search code examples
db2db2-luwibm-data-studio

Trying to use temporary table in IBM DB2 and facing issues


I am getting the following error while creating a stored procedure for testing purpose:

SQL Error [42601]: An unexpected token "DECLARE GLOBAL TEMPORARY TABLE SESSION" was found following "RSOR WITH RETURN FOR". Expected tokens may include: "".. SQLCODE=-104, SQLSTATE=42601, DRIVER=4.21.29

Code:

CREATE OR REPLACE PROCEDURE Test ( IN GE_OutPutType SMALLINT)
----------------------------------------------------------------------------------------------------
 DYNAMIC RESULT SETS 1 LANGUAGE SQL
BEGIN
DECLARE C CURSOR WITH RETURN FOR DECLARE GLOBAL TEMPORARY TABLE
    SESSION.TEMP (DATE CHAR(10) NOT NULL,
    SALARY DECIMAL(9,
    2) ,
    COMM DECIMAL(9,
    2));

INSERT
    INTO
        SESSION.TEMP (DATE,
        SALARY,
        COMM) SELECT
            VARCHAR_FORMAT(CURRENT_DATE,
            'MM/DD/YYYY'),
            10.2,
            11.5
        FROM
            sysibm.sysdummy1 
            
IF GE_OutPutType = 1
        BEGIN
            SELECT
                *
            FROM
                TEMP
            ELSEIF GE_OutPutType = 2 SELECT
                'HEADER' CONCAT SPACE(1979) CONCAT 'H'
            FROM
                sysibm.sysdummy1
            END OPEN C;
END

Solution

  • Your syntax is not valid.

    You must declare your temporary table independently of your cursor.

    You cannot combine these in a single statement.

    Use dynamic-SQL features to achieve what you need.

    Use instead the format:

    Declare c1 cursor with return to caller for Statement1

    and

    set v_cursor_text = 'select ... from session.temp ; `

    then use

    prepare Statement1 from v_cursor_text;

    and before you exit the stored procedure you need to leave the cursor opened:

    open c1;

    Do study the Db2 online documentation to learn more about these features.

    Here is a small fragment of your procedure showing what I mean:

    CREATE OR REPLACE PROCEDURE mytest ( IN GE_OutPutType SMALLINT)
    DYNAMIC RESULT SETS 1 
    LANGUAGE SQL
    specific mytest
    BEGIN
        DECLARE v_cursor_text varchar(1024);
        DECLARE C1 CURSOR WITH RETURN FOR Statement1;
    
        DECLARE GLOBAL TEMPORARY TABLE SESSION.TEMP (
            DATE CHAR(10) NOT NULL,
            SALARY DECIMAL(9,
            2) ,
            COMM DECIMAL(9,
            2))
         with replace on commit preserve rows not logged;
    
        INSERT INTO SESSION.TEMP (DATE, SALARY, COMM) 
          SELECT VARCHAR_FORMAT(CURRENT_DATE, 'MM/DD/YYYY'),
                10.2,
                11.5
           FROM sysibm.sysdummy1 ;
    
         if GE_OutPutType = 1
         then 
            set v_cursor_text = 'select * from session.temp';
         end if;
         if GE_OutPutType = 2
         then
            set v_cursor_text = 'select ''header'' concat space(1979) concat ''H'' from sysibm.sysdummy1';
         end if;
    
         prepare Statement1 from v_cursor_text;
         open c1;
        
                
    END@