如何在if条件下通过db2中的存储过程显示2条select语句输出

问题描述

基于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@