问题描述
基于OutPutType = 1,我需要显示2条select语句输出。在下面的代码中,我得到以下错误:(请注意,实际上我在2个select语句中有2个不同的数据集,但在这里作为参考,我写了一个select表示时间,而另一个则写成date)
sql错误[42601]:在“”之后发现意外的标记“”。预期的令牌可能包括:“ OM sysibm.sysdummy1'” .. sqlCODE = -104,sqlSTATE = 42601,DRIVER = 4.21.29
CREATE OR REPLACE
PROCEDURE Test.Test1 (
IN OutPutType SMALLINT)
DYNAMIC RESULT SETS 2 LANGUAGE sql SPECIFIC test1
BEGIN
DECLARE v_cursor_text VARCHAR(5000);
DECLARE v_cursor_text1 VARCHAR(5000);
DECLARE C1 CURSOR WITH RETURN FOR Statement1;
DECLARE C2 CURSOR WITH RETURN FOR Statement2;
IF OutPutType = 1 THEN
SET
v_cursor_text = ' SELECT CURRENT_TIME FROM sysibm.sysdummy1';
v_cursor_text1 = 'SELECT CURRENT_DATE FROM sysibm.sysdummy1';
END IF;
PREPARE Statement1
FROM
v_cursor_text;
PREPARE Statement2
FROM
v_cursor_text1;
OPEN c1;
OPEN C2;
END
解决方法
您没有为“ OutputType = 2”显示两个选择语句...
您设置的唯一select语句用于“ OutputType = 1”
另外,您拥有DYNAMIC RESULT SETS 1
,但同时打开了两个游标...因此,您应该拥有DYNAMIC RESULT SETS 2
您显示的两个select语句都不需要是动态的,您只需使用
DECLARE C1 cursor for
SELECT CURRENT_TIME FROM sysibm.sysdummy1;
希望您实际上并不打算这样获取日期和时间...
最后,您应该使用实际的Db2平台而不是db2-400和db2-luw标记问题。
,仅使用一个光标。根据输入参数构建SQL语句。
DECLARE C1 CURSOR WITH RETURN FOR Statement1;
IF OutPutType = 1 THEN
SET v_cursor_text = ' SELECT CURRENT_TIME FROM sysibm.sysdummy1';
else
set v_cursor_text = 'SELECT CURRENT_DATE FROM sysibm.sysdummy1';
END IF;
PREPARE Statement1
FROM
v_cursor_text ;
Open c1;
,
您的语法错误是由SET
之前的v_cursor_text1
动词引起的。
要获取要编译的过程,您的示例应为:
--#SET TERMINATOR @
CREATE OR REPLACE PROCEDURE Test.Test1 ( IN OutPutType SMALLINT)
DYNAMIC RESULT SETS 2
LANGUAGE SQL SPECIFIC test1
BEGIN
DECLARE v_cursor_text VARCHAR(5000);
DECLARE v_cursor_text1 VARCHAR(5000);
DECLARE C1 CURSOR WITH RETURN FOR Statement1;
DECLARE C2 CURSOR WITH RETURN FOR Statement2;
IF OutPutType = 1 THEN
SET v_cursor_text = ' SELECT CURRENT_TIME FROM sysibm.sysdummy1';
set v_cursor_text1 = 'SELECT CURRENT_DATE FROM sysibm.sysdummy1';
END IF;
PREPARE Statement1 FROM v_cursor_text;
PREPARE Statement2 FROM v_cursor_text1;
OPEN c1;
OPEN C2;
END@