繁体   English   中英

如何从 IBM DB2 中的存储过程返回临时表

[英]How to return temporary table from Stored Procedure in IBM DB2

我需要在 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 编译块中的语句顺序规则 游标声明必须在其他变量声明之后和其他可执行语句之前。

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

在此示例中,您可以通过使用从 RECORDUNITS ... EXCEPT ...OLDRECORDS 返回的查询来完全避免 DGTT。 但是,此答案显示了一种处理 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
@

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM