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

标签 sql db2 database-migration

我需要在 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;

第1页结束

最佳答案

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

可以稍后定义 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
@

关于sql - 如何从 IBM DB2 中的存储过程返回临时表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68016239/

相关文章:

Java SQL COUNT 值

sql - 我有一个sqlite语法错误。什么不对?

python - Django "ValueErrror: could not find common ancestor of {migrations}"

python - 为什么 django_migrations 表在所有数据库中

sql - 检索层次结构的上升行

mysql - INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN 有什么区别?

sql - 将 DB2 SQL Decimal 转换为 DATE

eclipse - eclipse中通过jdbc连接DB2数据库

db2 - 与 VSAM 相比,DB2 有哪些优势?

grails - 从迁移中更新字段