如何在if条件下通过db2中的存储过程显示2select语句输出
How to display 2 select statement output through stored procedure in db2 under if condition
基于OutPutType=1,我需要显示2条select语句输出。在下面的代码中,我收到以下错误:(请注意,实际上我在 2 select 语句中有 2 个不同的数据集,但这里为了参考,我写了一个 select 用于时间,另一个语句用于日期)
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 语句...
您设置的唯一 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;
您的语法错误是由于 v_cursor_text1
之前缺少 SET
动词造成的。
要编译程序,您的示例应为:
--#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@
基于OutPutType=1,我需要显示2条select语句输出。在下面的代码中,我收到以下错误:(请注意,实际上我在 2 select 语句中有 2 个不同的数据集,但这里为了参考,我写了一个 select 用于时间,另一个语句用于日期)
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 语句...
您设置的唯一 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;
您的语法错误是由于 v_cursor_text1
之前缺少 SET
动词造成的。
要编译程序,您的示例应为:
--#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@