【问题标题】:DB2 stored procedure is not returning the result setDB2 存储过程未返回结果集
【发布时间】:2015-03-06 10:52:52
【问题描述】:

我有一个在数据库中插入一行的 DB2 存储过程。存储过程如下:

CREATE PROCEDURE ZSPPQINSERTUSERIDBA ( 
        IN P_USERID             CHAR(10),
        IN P_BUSINESSAREA       CHAR(10),
        IN P_SELECTEDIND        CHAR(1),
        IN P_DEFAULTIND         CHAR(1),
        IN P_LEGACYSYSTEM       CHAR(10),
        IN P_LEGACYLOGIN        CHAR(16),
        IN P_LEGACYPASSWORD     CHAR(16),
        IN P_OTHERLOGIN         CHAR(10),
        IN P_OTHERPASSWORD      CHAR(10),
        IN P_ADDSECURLOGIN      CHAR(10),
        IN P_ADDSECURPASSWORD   CHAR(10),
        IN P_LASTUPDATEUSERID   CHAR(10),
        IN P_LASTUPDATE         TIMESTAMP)

    DYNAMIC RESULT SETS 1 
    LANGUAGE SQL 
    SPECIFIC ZSPPQINSERTUSERIDBA 
    NOT DETERMINISTIC 
    MODIFIES SQL DATA 
    CALLED ON NULL INPUT
    SET OPTION  ALWBLK = *ALLREAD ,
    ALWCPYDTA = *OPTIMIZE , 
    COMMIT = *CS , 
    CLOSQLCSR = *ENDMOD ,
    DECRESULT = (31, 31, 00) , 
    DFTRDBCOL = *NONE , 
    DYNDFTCOL = *NO , 
    DYNUSRPRF = *USER ,
    RDBCNNMTH = *RUW ,
    SRTSEQ = *HEX 

    P1 : BEGIN

    DECLARE TOTALCNT INTEGER DEFAULT 0 ; 

    DECLARE C1 CURSOR WITH RETURN FOR 
      SELECT Count (*) FROM USERBUSINESSAREA
       WHERE USERID            = P_USERID
         AND BUSINESSAREA = P_BUSINESSAREA;

    OPEN C1;
     FETCH C1 INTO TOTALCNT;
    CLOSE C1;

    IF ( TOTALCNT = 0) THEN 
      INSERT 
      INTO  USERBUSINESSAREA    
        (
            USERID,
            BUSINESSAREA,
            SELECTEDIND,
            DEFAULTIND,
            LEGACYSYSTEM,
            LEGACYLOGIN,
            LEGACYPASSWORD,
            OTHERLOGIN,
            OTHERPASSWORD,
            ADDSECURLOGIN,
            ADDSECURPASSWORD,
            LASTUPDATEUSERID,
            LASTUPDATE
        )
            VALUES  (P_USERID,
                     P_BUSINESSAREA,
                     P_SELECTEDIND,
                     P_DEFAULTIND,
                     P_LEGACYSYSTEM,
                     P_LEGACYLOGIN,
                     P_LEGACYPASSWORD,
                     P_OTHERLOGIN,
                     P_OTHERPASSWORD,
                     P_ADDSECURLOGIN,
                     P_ADDSECURPASSWORD,
                     P_LASTUPDATEUSERID,
                     P_LASTUPDATE);
      END IF;
    END P1;

当我尝试从 Java/Spring-Integration 层执行上述存储过程时,没有返回任何结果集。我需要对上述存储过程进行哪些更改才能返回结果集?

【问题讨论】:

  • 结果集是一个打开的游标。当过程返回时,您没有任何打开的游标。如果您只需要返回一个值,则不需要结果集——请改用OUT 参数。
  • 您是否只想知道您是否在数据库中插入了行?我的意思是,与已经有一个相反。 Java 层需要哪些实际信息?您正在尝试做的更大范围的任务是什么?

标签: spring stored-procedures jdbc db2


【解决方案1】:

你到底想返回什么?

  • 有一个光标,您可以在其中选择元素的数量,并将其分配给变量。之后,光标关闭。
  • 根据检索到的数量,您执行插入操作。

我不知道你期望什么:

  • 是否要返回结果集?然后你应该有一个打开的光标。 (例如,从 USERBUSINESSAREA 中选择 *)
  • 是否要在游标中返回检索到的值?然后,正如@mustaccio 所说,您可以添加一个 OUT 参数,然后只需分配值。

【讨论】:

  • ...这是评论,而不是真正的答案。
【解决方案2】:

以下修改后的存储过程对我有用(只是将WITH RETURN FOR 更改为RETURN TO CALLER FOR):

CREATE PROCEDURE ZSPPQINSERTUSERIDBA ( 
        IN P_USERID             CHAR(10),
        IN P_BUSINESSAREA       CHAR(10),
        IN P_SELECTEDIND        CHAR(1),
        IN P_DEFAULTIND         CHAR(1),
        IN P_LEGACYSYSTEM       CHAR(10),
        IN P_LEGACYLOGIN        CHAR(16),
        IN P_LEGACYPASSWORD     CHAR(16),
        IN P_OTHERLOGIN         CHAR(10),
        IN P_OTHERPASSWORD      CHAR(10),
        IN P_ADDSECURLOGIN      CHAR(10),
        IN P_ADDSECURPASSWORD   CHAR(10),
        IN P_LASTUPDATEUSERID   CHAR(10),
        IN P_LASTUPDATE         TIMESTAMP)

    DYNAMIC RESULT SETS 1 
    LANGUAGE SQL 
    SPECIFIC ZSPPQINSERTUSERIDBA 
    NOT DETERMINISTIC 
    MODIFIES SQL DATA 
    CALLED ON NULL INPUT
    SET OPTION  ALWBLK = *ALLREAD ,
    ALWCPYDTA = *OPTIMIZE , 
    COMMIT = *CS , 
    CLOSQLCSR = *ENDMOD ,
    DECRESULT = (31, 31, 00) , 
    DFTRDBCOL = *NONE , 
    DYNDFTCOL = *NO , 
    DYNUSRPRF = *USER ,
    RDBCNNMTH = *RUW ,
    SRTSEQ = *HEX 

    P1 : BEGIN

    DECLARE TOTALCNT INTEGER DEFAULT 0 ; 

    DECLARE C1 CURSOR WITH RETURN TO CALLER FOR
      SELECT Count (*)  FROM USERBUSINESSAREA
       WHERE USERID            = P_USERID
         AND BUSINESSAREA = P_BUSINESSAREA;

    OPEN C1;

     FETCH C1 INTO TOTALCNT;


    IF ( TOTALCNT = 0) THEN 
      INSERT 
      INTO  USERBUSINESSAREA    
        (
            USERID,
            BUSINESSAREA,
            SELECTEDIND,
            DEFAULTIND,
            LEGACYSYSTEM,
            LEGACYLOGIN,
            LEGACYPASSWORD,
            OTHERLOGIN,
            OTHERPASSWORD,
            ADDSECURLOGIN,
            ADDSECURPASSWORD,
            LASTUPDATEUSERID,
            LASTUPDATE
        )
            VALUES  (P_USERID,
                     P_BUSINESSAREA,
                     P_SELECTEDIND,
                     P_DEFAULTIND,
                     P_LEGACYSYSTEM,
                     P_LEGACYLOGIN,
                     P_LEGACYPASSWORD,
                     P_OTHERLOGIN,
                     P_OTHERPASSWORD,
                     P_ADDSECURLOGIN,
                     P_ADDSECURPASSWORD,
                     P_LASTUPDATEUSERID,
                     P_LASTUPDATE);
      END IF;

    END P1;

【讨论】:

  • 由于你的游标只希望有一行,并且你在过程中做了一个FETCH,所以返回给调用者的结果集将定位在最后,换句话说,调用者不会再从中获取任何东西。
  • @mustaccio 是的..你是对的。它不会包含任何内容。唯一的区别是结果集对象不会为空。我要求结果在 Java 端不为空。所以它解决了我的问题。
猜你喜欢
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-24
  • 2016-03-27
  • 2011-04-22
相关资源
最近更新 更多