【问题标题】:How to return temporary table from Stored Procedure in IBM DB2如何从 IBM DB2 中的存储过程返回临时表
【发布时间】:2021-09-02 01:47:07
【问题描述】:

我需要在 IBM DB2 中创建存储过程,我们必须在其中创建临时表并在该临时表中插入和删除一些值并返回临时表。

IBM DB2 中的存储过程出现以下错误

DB2ADMIN.GETRECORDS - 部署已开始。 创建存储过程返回 SQLCODE:-104,SQLSTATE:42601。 DB2ADMIN.GETRECORDS: 39: 在“”之后发现了一个意外的标记“”。预期的标记可能包括:“”.. SQLCODE=-104, SQLSTATE=42601, DRIVER=4.19.56 在“”之后发现了一个意外的标记“”。预期的标记可能包括:“”.. SQLCODE=-104, SQLSTATE=42601, DRIVER=4.19.56 DB2ADMIN.GETRECORDS - 部署失败。 DB2ADMIN.GETRECORDS - 回滚成功完成。

下面是 IBM DB2 中的存储过程

CREATE OR REPLACE PROCEDURE GETRECORDS ()
DYNAMIC RESULT SETS 1

P1:开始

-- temporary table declared 
DECLARE GLOBAL TEMPORARY TABLE SESSION.TEMPRECORDDETAILS
    (Column1 NVARCHAR(50) NOT NULL,
     Column2 NVARCHAR(50) NOT NULL,
     Column3 NVARCHAR(50) NOT NULL,
     Column4 NVARCHAR(255) NOT NULL,
     Column5 FLOAT ,
     Column6 FLOAT ,
     Column7 NVARCHAR(50) NOT NULL,
     Column8 FLOAT ,
     Column9 FLOAT ,
     Column10 NVARCHAR(255) NOT NULL
    );

-- inserted data in temporary table
INSERT INTO SESSION.TEMPRECORDDETAILS 
    SELECT  VM.Column1,
            VM.Column2,
            VM.Column3,
            VM.Column4,
            VM.Column5,
            VM.Column6,
            VM.Column7,
            VM.Column8,
            VM.Column9,TRIM(VM.Column1) + TRIM(VM.Column2) + TRIM(VM.Column3)
    FROM    (SELECT * FROM  RECORDUNITS )
AS VM       

-- deleted data from temporary table
DELETE FROM  SESSION.TEMPRECORDDETAILS 
WHERE TRIM(Column10) IN(SELECT TRIM(Column1) + TRIM(Column2) + TRIM(Column3) 
                    FROM OLDRECORDS);

-- trying to return temporary table
DECLARE entCursor1 CURSOR WITH RETURN FOR
    SELECT Column1, 
       Column2,
       Column3,
       Column4,
       Column5,
       Column6,
       Column7,
       Column8,
       Column9
    FROM SESSION.TEMPRECORDDETAILS ORDER BY Column1;
OPEN entCursor1;

结束P1

【问题讨论】:

标签: sql db2 database-migration


【解决方案1】:

对于复合 SQL 编译块中的语句顺序,您需要遵守 rules。游标声明必须在其他变量声明之后和其他可执行语句之前。

DGTT 可以稍后定义,游标(在 DGTT 之前被声明但未定义)可以在 DGTT 填充后稍后定义和准备。

在此示例中,您可以完全避免 DGTT,方法是使用从 RECORDUNITS ... EXCEPT ...OLDRECORDS 返回的查询。但是,此答案显示了一种处理 DGTT 光标的方法。

CREATE OR REPLACE PROCEDURE GETRECORDS ()
DYNAMIC RESULT SETS 1
P1: BEGIN
   declare v_cursor_text varchar(1024);
   DECLARE entCursor1 CURSOR WITH RETURN FOR Statement1;

   -- temporary table declared 
   DECLARE GLOBAL TEMPORARY TABLE SESSION.TEMPRECORDDETAILS
    (Column1 NVARCHAR(50) NOT NULL,
     Column2 NVARCHAR(50) NOT NULL,
     Column3 NVARCHAR(50) NOT NULL,
     Column4 NVARCHAR(255) NOT NULL,
     Column5 FLOAT ,
     Column6 FLOAT ,
     Column7 NVARCHAR(50) NOT NULL,
     Column8 FLOAT ,
     Column9 FLOAT ,
     Column10 NVARCHAR(255) NOT NULL
    ) with replace on commit preserve rows not logged ;

   -- inserted data in temporary table
    INSERT INTO SESSION.TEMPRECORDDETAILS
    SELECT  VM.Column1,
            VM.Column2,
            VM.Column3,
            VM.Column4,
            VM.Column5,
            VM.Column6,
            VM.Column7,
            VM.Column8,
            VM.Column9,TRIM(VM.Column1) + TRIM(VM.Column2) + TRIM(VM.Column3)
    FROM    (SELECT * FROM  RECORDUNITS ) AS VM;

    -- deleted data from temporary table
    DELETE FROM  SESSION.TEMPRECORDDETAILS
    WHERE TRIM(Column10) IN(SELECT TRIM(Column1) + TRIM(Column2) + TRIM(Column3)
                    FROM OLDRECORDS);
    set v_cursor_text = 'SELECT Column1, 
       Column2,
       Column3,
       Column4,
       Column5,
       Column6,
       Column7,
       Column8,
       Column9
    FROM SESSION.TEMPRECORDDETAILS ORDER BY Column1' ;

    prepare Statement1 from v_cursor_text;

    
    OPEN entCursor1;

END P1
@

【讨论】:

    猜你喜欢
    • 2010-11-29
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    相关资源
    最近更新 更多