JAVA使用delete和insert语句调用存储过程

时间:2013-09-25 16:12:19

标签: java tsql stored-procedures resultset

我的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

3 个答案:

答案 0 :(得分:1)

这是什么数据库?在大多数数据库中,您可以在操作失败时执行RAISEERROR。这会导致抛出JDBCException。

您可以通过检查@@ rowcount来检查插入是否成功。如果受影响的行数为零,则可能需要抛出异常。

http://technet.microsoft.com/en-us/library/ms187316.aspx

答案 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