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

如何在if条件下通过db2中的存储过程显示2条select语句输出,db2,db2-400,db2-luw,Db2,Db2 400,Db2 Luw,根据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

根据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”

另外,您有
动态结果集1
但同时打开两个游标…因此您应该有
动态结果集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\u cursor\u 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@

嗨,查尔斯,这两个select语句本质上是假的。。。我有两个不同的数据集,我需要显示输出类型=1…hi@satya,当输出类型为1时,我需要显示两个select语句输出。一个是细节输出,另一个是摘要输出。因此,在本例中,我不能在select语句中使用if else。如果您的过程可以有两个不同的结果集,则在创建过程时必须使用
动态结果集2
,如果只有一个结果集,则第二个结果集不得产生任何行。这可能被认为是一个糟糕的设计。@mao我尝试使用动态结果集2,但仍然得到相同的错误您的示例过程中的语法错误结果在
c\u cursor\u text1
之前缺少一个
set
。修正你的语法。