【问题标题】:How to display 2 select statement output through stored procedure in db2 under if condition如何在if条件下通过db2中的存储过程显示2个select语句输出
【发布时间】:2020-10-13 22:22:20
【问题描述】:

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

【问题讨论】:

  • 如果你的过程可以有两个不同的结果集,那么你必须在创建过程时使用DYNAMIC RESULT SETS 2,如果你只有一个结果集,那么第二个结果集必须产生没有行。这可能被认为是糟糕的设计。
  • @mao 我尝试使用动态结果集 2 但仍然遇到相同的错误
  • 您的语法错误是由于您的示例过程在c_cursor_text1 之前缺少SET。修正你的语法。

标签: db2 db2-400 db2-luw


【解决方案1】:

您的语法错误是由于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@

【讨论】:

    【解决方案2】:

    您没有为“OutputType=2”显示两个选择语句...

    您设置的唯一选择语句是“OutputType=1”

    另外,你有DYNAMIC RESULT SETS 1,但同时打开了两个光标...所以你应该有DYNAMIC RESULT SETS 2

    您显示的选择语句都不需要是动态的,您可以简单地使用一个

    DECLARE C1 cursor for
      SELECT CURRENT_TIME FROM sysibm.sysdummy1;
    

    希望您实际上并不打算以这种方式获取日期和时间...

    最后,您应该使用实际的 Db2 平台来标记问题,而不是同时使用 db2-400 和 db2-luw。

    【讨论】:

    • 嗨,Charles,这 2 个 select 语句本质上是虚拟的...我有 2 个不同的数据集,我需要为 Output Type=1 显示...
    【解决方案3】:

    只使用一个光标。根据输入参数构建 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;
    

    【讨论】:

    • 嗨@satya,当输出类型为 1 时,我需要显示两个 select 语句输出。一种是明细输出,另一种是汇总输出。所以在这种情况下,我不能在 select 语句中使用 if else。
    猜你喜欢
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-07
    • 2010-12-24
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    相关资源
    最近更新 更多