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