尝试在IBM DB2中使用临时表并面临问题

时间:2020-10-08 13:32:31

标签: db2 db2-luw ibm-data-studio

创建用于测试目的的存储过程时出现以下错误:

SQL错误[42601]:意外的令牌“ DECLARE GLOBAL TEMPORARY TABLE 在“ RSOR WITH RETURN FOR”之后找到“ SESSION”。期望的令牌可能包括:“”。SQLCODE = -104,SQLSTATE = 42601,DRIVER = 4.21.29

代码:

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

1 个答案:

答案 0 :(得分:0)

您的语法无效。

您必须独立于光标声明临时表。

您不能将它们合并成一个语句。

使用动态SQL功能来满足您的需求。

使用以下格式:

Declare c1 cursor with return to caller for Statement1

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

然后使用

prepare Statement1 from v_cursor_text;

在退出存储过程之前,需要保持光标打开:

open c1;

请研究Db2在线文档,以了解有关这些功能的更多信息。

这是您的程序的一小部分,显示了我的意思:

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@