如何在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@