1

顧客を削除する Sybase ASE (15) ストアド プロシージャをコーディングしようとしています。「外部キー制約違反」が原因で DELETE が失敗する可能性があります。その場合、ストアド プロシージャはトランザクションをロールバックして戻る必要があります。

CREATE PROCEDURE dbo.spumb_deleteCustomer @customertodelete int AS BEGIN
   BEGIN TRANSACTION TRX_UMBDELCUSTOMER

   DELETE CREDITCARDS WHERE CUSTOMERID = @customertodelete
   DELETE CUSTOMER_SELECTION_MAP WHERE CUSTOMERID = @customertodelete
   DELETE CUSTOMERS WHERE ID = @customertodelete
   SELECT @rcnt = @@ROWCOUNT
   IF (@rcnt <> 1) BEGIN
     PRINT 'FAILED TO DELETE CUSTOMER'
     ROLLBACK TRANSACTION TRX_UMBDELCUSTOMER
     RETURN
   END 
   COMMIT TRANSACTION TRX_UMBDELCUSTOMER
END

この SP をカーソルで実行すると、最初の無効な DELETE の後で実行が中止されます。カーソルを継続させるにはどうすればよいですか (または、SP でエラーが発生しないようにするにはどうすればよいですか)。

ありがとう、サイモン

4

1 に答える 1

0

@@rowcount を探してそれらのエラーを処理するのではなく、@@error !=0 をチェックしてエラーを示す必要があります。そうしないと、呼び出し元のクライアントに予期しないメッセージが返される可能性があります。@@rowcount をチェックする場合は、各コマンドによってリセットされるため、削除するたびにすぐに変数に保存する必要があります。

特に外部キー違反メッセージを取得しようとしている場合は、@@error で 546 または 547 をチェックできます。これらは、失敗したときに @@error で返されるためです。

http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc00729.1500/html/errMessageAdvRes/BABCCECF.htm

http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc00729.1500/html/errMessageAdvRes/BABHJIEC.htm

于 2017-07-28T14:17:56.723 に答える