2015-01-08 148 views
0

我有一个DB2存储过程,它在数据库中插入一行。该存储过程是如下: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 /弹簧集成层上面的存储过程,则不返回结果集。我需要为上述存储过程返回结果集做什么更改?

+0

结果集是一个开放的光标。过程返回时,您没有任何打开的游标。如果所有需要返回的值都是单个值,则不需要结果集 - 而是使用“OUT”参数。 – mustaccio

+0

你只是想知道你是否在数据库中插入了该行?我的意思是,与已经存在的相反。你在Java层需要什么实际的信息?你试图做的大图任务是什么? –

回答

0

以下修改存储过程为我工作(只是改变WITH RETURN FORRETURN 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; 
+0

由于你的游标只有一行,并且你在程序中做了一个'FETCH',所以返回给调用者的结果集将被定位在最后,换句话说,调用者不会从中获取任何东西更多。 – mustaccio

+0

@mustaccio是的..你是对的。它不会包含任何内容。唯一的区别是结果集对象不会为空。我要求结果在Java结束时不为空。所以它解决了我的问题。 –

0

你想要返回什么?

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

我不知道您的期望:

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

...这是一条评论,不是真正的答案。 –