一尘不染

Sybase中的错误处理

sql

有没有一种方法来处理错误SYBASE,比如TRY-CATCH,你可以在使用块MS SQL ServerOracle等等?

我已经在网上搜索过,发现的唯一选择是global变量@@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错误处理是如何工作的吗?


阅读 144

收藏
2021-03-10

共1个答案

一尘不染

第一种解决方案。

您无法以这种方式在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
2021-03-10