0

私のSPには、DELETEおよびINSERT INTOステートメントが含まれています。DELETE ステートメントが成功し、INSERT INTO が失敗した場合、JAVA は最初のステートメントのみを調べて、SP 全体が正常に実行されたと結論付けますが、これは間違っている可能性があります。

ステートメントの 1 つだけが失敗した場合に、複数のステートメントを実行して 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
4

3 に答える 3

1

削除された行数がゼロの場合は、削除の行数を取得してエラーを発生させることができます。また、挿入ステートメントの場合は、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から、それを値として state パラメータに渡します。RAISERROR

乾杯 !!

于 2013-09-25T18:07:55.637 に答える