Muh*_*jaz 3 java sql stored-procedures
这是我的存储过程,它返回一个值。我需要调用此过程并将该返回值放入我的 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
Run Code Online (Sandbox Code Playgroud)
这是我如何尝试将此值放入上述存储过程返回的 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);
Run Code Online (Sandbox Code Playgroud)
我已经查看了已接受的答案/sf/answers/136396291/。我也在以同样的方式尝试,但不知何故无法获得返回值
请参阅此处接受的答案。
首先,您应该决定您的 SP 是否会返回 ResultSet。我的意思是,当您发现错误时,您会这样做RETURN -1
。但是,如果一切正常,您执行 a 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);
Run Code Online (Sandbox Code Playgroud)
但是,如果您返回 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);
Run Code Online (Sandbox Code Playgroud)
我已经使用玩具 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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
23314 次 |
最近记录: |