我的SP确实包含DELETE和INSERT INTO语句。如果DELETE语句成功,但INSERT INTO没有,JAVA只会查看第一个语句并得出结论,整个SP已成功执行,这可能是错误的。
如果只有一个语句失败,我如何执行多个语句并在JAVA中获得异常。 我已经尝试过在SQL中使用TRY-CATCH但是这一切都得出结论,所有语句都正确执行,因为第一个语句成功。
它是MS SQL 2008数据库
ALTER PROCEDURE [testing]
@bikes varchar(8000),
@groupw varchar(4),
@name char(6)
AS
BEGIN
DELETE CP_customer_kngr_corr_s WHERE knid in ('blue')
DECLARE @pos INT
DECLARE @len INT
DECLARE @value varchar(8000)
set @pos = 0
set @len = 0
set @bikes= @bikes +','
WHILE CHARINDEX(',', @bikes, @pos)>0 BEGIN
set @len = CHARINDEX(',', @bikes, @pos+1) - @pos
set @value = SUBSTRING(@bikes, @pos, @len)
INSERT INTO [bikes]
([bikes])
VALUES
(@value)
set @pos = CHARINDEX(',', @bikes, @pos+@len) +1
END
END
答案 0 :(得分:1)
这是什么数据库?在大多数数据库中,您可以在操作失败时执行RAISEERROR。这会导致抛出JDBCException。
您可以通过检查@@ rowcount来检查插入是否成功。如果受影响的行数为零,则可能需要抛出异常。
答案 1 :(得分:1)
如果删除的行数为零,则可以获取rowcount for delete并引发错误;对于insert语句,可以使用try / catch并在catch块中引发错误。
//Perform delete
select @@ROWCOUNT
if @@ROWCOUNT = 0
//RAISE ERROR
BEGIN TRY
//perform insert here
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.
);
END CATCH;
同时检查ERROR_STATE
返回的错误状态,然后将其作为值传递给RAISERROR
干杯!!
答案 2 :(得分:0)
我的SP中的问题是没有设置SET NOCOUNT ON;
。通过它返回删除是成功的而不是SELECT语句。
以下是最终结果。
ALTER PROCEDURE [testing]
@bikes varchar(8000),
@groupw varchar(4),
@name char(6)
AS
BEGIN
SET NOCOUNT ON;
DELETE CP_customer_kngr_corr_s WHERE knid in ('blue')
DECLARE @pos INT
DECLARE @len INT
DECLARE @value varchar(8000)
set @pos = 0
set @len = 0
set @bikes= @bikes +','
WHILE CHARINDEX(',', @bikes, @pos)>0 BEGIN
set @len = CHARINDEX(',', @bikes, @pos+1) - @pos
set @value = SUBSTRING(@bikes, @pos, @len)
INSERT INTO [bikes]
([bikes])
VALUES
(@value)
set @pos = CHARINDEX(',', @bikes, @pos+@len) +1
END
END