2015-01-08 145 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

...這是一條評論,不是真正的答案。 –