4

有没有办法处理 中的错误SYBASE,例如TRY-CATCH可以在 、 等中使用MS SQL Server的块Oracle

我在网上搜索过,我发现的唯一选项是 global variable @@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

第二种解决方案。

您还可以将更新命令放入过程中,然后您可以捕获异常。创建过程:

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