2013-11-28 19 views
1

這是我的存儲過程,它返回一個值。我需要調用這個過程並將返回值傳入我的java程序中。 使用java從sql server存儲過程中檢索返回的值

CREATE PROCEDURE my_procedure @advisor de , @adv_xml xml 

AS  


begin   
    declare 
    @psrg_idi idi, 
    @adv_cd cd, 
    @CurrDate cdt 

    set @adv_cd = (select adv_cd from dbo.ADVICE_LK where upper(rtrim(adv_de)) = upper(@advisor)) 
    set @psrg_idi = 0  
    set @CurrDate = getdate() 

    BEGIN TRY  
     exec my_proc_2 @CurrDate,@psrg_idi output 

     insert into 
      ADVICE 
      (psrg_idi, 
      adv_cd, 
      psra_original_xml) 
     values 
     (@psrg_idi, 
     @adv_cd, 
     @adv_xml) 

     select 
     @psrg_idi as psrg_idi 

    END TRY  
    BEGIN CATCH  
     DECLARE @ErrorMessage NVARCHAR(4000);  
     DECLARE @ErrorSeverity INT;  
     DECLARE @ErrorState INT;  
     SELECT  
     @ErrorMessage = ERROR_MESSAGE(),  
    @ErrorSeverity = ERROR_SEVERITY(),  
    @ErrorState = ERROR_STATE();  
    -- Use RAISERROR inside the CATCH block to return error  
    -- information about the original error that caused  
    -- execution to jump to the CATCH block.  
    RAISERROR (@ErrorMessage, -- Message text.  
    @ErrorSeverity, -- Severity.  
    @ErrorState -- State.  
    );  
    return -1  
    END CATCH  

end 

這裏是我想如何獲得這個值到我的java程序返回上述存儲過程。當我從java調用這個過程時,所有期望值都存儲在數據庫表中。但我收到返回值groupId'0'..任何想法或幫助將不勝感激。

CallableStatement cs = con.prepareCall("{? = call my_procedure (?,?)}");     
int i = 0; 
cs.registerOutParameter(++i, java.sql.Types.INTEGER); 
cs.setString(++i, advisor); 
cs.setString(++i, adviceXml); 

cs.execute(); 
int groupId = cs.getInt(1); 

我已經檢討接受的答案https://stackoverflow.com/a/1948518/674476。我也嘗試以相同的方式,但不知何故無法獲得返回的值

+0

什麼是您的RDBMS? – dasblinkenlight

+0

@ dasblinkenlight,MS SQL Server –

回答

0

下面是問題的解決方案,它在我的情況下工作得很好。

CallableStatement cs = con.prepareCall("{call my_procedure(?,?)}"); 
int i = 0; 
cs.setString(++i, advisor); 
cs.setString(++i, adviceXml); 

boolean isRs = cs.execute(); 
int updateCount = cs.getUpdateCount(); 
// cs.getUpdateCount() will return -1 if the current result is a ResultSet object 
// or there are no more results 
// cs.getMoreResults() will return true if the next result is a ResultSet object; 
// false if it is an update count or there are no more results 

while (!isRs && (cs.getUpdateCount() != -1)) { 
    isRs = cs.getMoreResults(); 
} 

if (isRs) { 
    ResultSet rs = cs.getResultSet(); 
    try { 
     if (rs.next()) { 
      groupId = rs.getString("psrg_idi"); 
     } 
    } finally { 
     rs.close(); 
    } 
} 
3

查看接受的答案here

首先,你應該決定你的SP是否會返回一個ResultSet。我的意思是,當你遇到錯誤時,你做RETURN -1。但是,如果一切正常,則執行SELECT,它將返回一個ResultSet。

說,如果你選擇返回一個值,你要做的:

CallableStatement cs = con.prepareCall("{? = call my_procedure (?,?)}");     
int i = 0; 
cs.registerOutParameter(++i, java.sql.Types.INTEGER); 
cs.setString(++i, advisor); 
cs.setString(++i, adviceXml); 

cs.execute(); 
int groupId = cs.getInt(1); 

但是,如果你返回ResultSet,你要做的:

CallableStatement cs = con.prepareCall("{call my_procedure (?,?)}");     
int i = 0; 
cs.setString(++i, advisor); 
cs.setString(++i, adviceXml); 

ResultSet rs = cs.executeQuery(); 
if (rs.next()) 
    int groupId = rs.getInt(1); 

我已經使用玩具SP測試兩種方法:

CREATE PROCEDURE my_procedure @v1 int, @v2 int 
AS 
BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

    --SELECT @v1 + @v2 as sumVal -- Comment this and uncomment previous line to test Return 
RETURN @[email protected] -- Comment this and uncomment previous line to test ResultSet 
END 
+0

cs.execute();無法返回int值... – Imran

+0

查看我更新的答案 – neutrino

+0

問題是,如何執行函數返回值 – Imran