4

で使用できるブロックSYBASEなど、のエラーを処理する方法はありますか?TRY-CATCHMS SQL ServerOracle

Webを検索しましたが、見つかった唯一のオプションはグローバル変数でしたが、@@error期待どおりに機能しませんでした。たとえば、次のコードです。

begin tran

update table1
set name = 'new name'
where name = 'old name'

update table2
set id = 1 
where id = 30
-- suppose id has a unique constraint and there's already a row with id = 1

IF @@error = 0
begin
    print 'commited'
    commit
end
else
begin
    print 'rolled back'
    rollback
end

table1で変更した名前は、ここでテストした古い値を保持しているため、実際に何らかの形でロールバックしますが、メッセージを出力したり、エラーの原因となった命令の後に入力した命令を実行したりすることはありません。

誰かがこれで私を助けることができますか?Sybaseのエラー処理が実際にどのように機能するか知っていますか?

4

1 に答える 1

3

最初の解決策。

この方法でSybaseで例外をキャッチすることはできません。更新する前に、データを確認する必要があります。

if not exists
(
  select 1 from table2
  where id = 1
)
begin
  update table2
  set id = 1 
  where id = 30
end
else
begin
  print 'rolled back'
  rollback
end

2番目の解決策。

プロシージャに更新コマンドを追加して、例外をキャッチすることもできます。手順の作成:

create procedure myproc
as
begin
  update table2
  set id = 1 
  where id = 30
end

以下のように実行します。

begin tran

update table1
set name = 'new name'
where name = 'old name'

exec myproc

IF @@error = 0
begin
    print 'commited'
    commit
end
else
begin
    print 'rolled back'
    rollback
end
于 2012-10-10T06:44:45.130 に答える