带有delete和insert语句的JAVA调用存储过程

带有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),

我的SP包含DELETE和INSERT INTO语句。如果DELETE语句成功,但INSERT INTO不成功,JAVA将只查看第一条语句,并得出整个SP已成功执行的结论,这可能是错误的

如果只有一条语句失败,如何执行多条语句并在JAVA中获得异常。 我曾在SQL中尝试过TRY-CATCH,但都得出结论,all语句执行正确,因为第一条语句成功

它是一个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

这是什么数据库?在大多数数据库中,当操作失败时,可以执行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驱动程序的所有结果。