使用java从sql server存储过程中检索返回的值

这是我的商店程序,它返回一个值。 我需要调用此过程并将该返回值放入我的java程序中。

 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 。 我也以同样的方式尝试,但不知何故无法获得返回值

请参阅此处接受的答案

首先,您应该决定您的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 @v1+@v2 -- Comment this and uncomment previous line to test ResultSet END 

下面是问题的解决方案,在我的情况下它完全正常。

 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(); } }