带有delete和insert语句的JAVA调用存储过程
我的SP包含DELETE和INSERT INTO语句。如果DELETE语句成功,但INSERT INTO不成功,JAVA将只查看第一条语句,并得出整个SP已成功执行的结论,这可能是错误的 如果只有一条语句失败,如何执行多条语句并在JAVA中获得异常。 我曾在SQL中尝试过TRY-CATCH,但都得出结论,all语句执行正确,因为第一条语句成功 它是一个MS SQL 2008数据库带有delete和insert语句的JAVA调用存储过程,java,tsql,stored-procedures,resultset,Java,Tsql,Stored Procedures,Resultset,我的SP包含DELETE和INSERT INTO语句。如果DELETE语句成功,但INSERT INTO不成功,JAVA将只查看第一条语句,并得出整个SP已成功执行的结论,这可能是错误的 如果只有一条语句失败,如何执行多条语句并在JAVA中获得异常。 我曾在SQL中尝试过TRY-CATCH,但都得出结论,all语句执行正确,因为第一条语句成功 它是一个MS SQL 2008数据库 ALTER PROCEDURE [testing] @bikes varchar(8000),
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
这是什么数据库?在大多数数据库中,当操作失败时,可以执行RAISEERROR。这将导致引发JDBCException 您可以通过检查@@rowcount来检查插入是否成功。如果受影响的行数为零,则可能希望引发异常
如果删除的行数为零,则可以获取删除和引发错误的行数,对于insert语句,可以在catch块中使用try/catch和raise error
//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;
在将其作为值传递给RAISERROR
的状态参数之前,还要检查error\u state
返回的错误状态
干杯 我的SP中的问题是
未设置计数代码>未设置。它返回的结果是delete是成功的,而不是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
这是一个MS SQL 2008数据库。我知道RaiseError在这个愿景中起作用。但是您将如何重新编写SP?您可能希望使用@rowcount跟踪插入是否成功。当我按照您的建议执行操作时,如果我在SQL server上调用SP,它将正常工作。它返回一个带有“error”或“success”的表。但是我的JAVA说它不返回结果集,因为它通过第一个DELETE语句返回。com.microsoft.sqlserver.jdbc.SQLServerException:该语句没有返回结果集。潜在错误是什么消息,DELETE或insert中是否有任何失败??Sachin Thapa,您的解决方案适合DELETE语句,因为这在大多数情况下都是正确的。我的问题还在于没有考虑到这一点;“JAVA将只查看第一条语句并得出整个SP已成功执行”是什么意思?你可能误解了结果。请说明如何从Java调用该过程,以及如何得出仅执行了第一条语句的结论。您可能需要在存储过程中添加SET NOCOUNT ON
,或者需要迭代返回给JDBC驱动程序的所有结果。