将SYBASE ASE的RAISERROR迁移至ORACLE:PL/SQL错误处理求助
Sybase到PL/SQL的错误处理迁移修正
先明确原Sybase代码的逻辑:
执行
DELETE table_1 WHERE N=0后,获取执行的行计数、错误码、SQL状态;如果错误码不为0,抛出自定义错误40900,设置错误代码为1并返回。
你写的Oracle代码存在几个问题:
- 异常处理块被单独的
BEGIN...END包裹,块内的SWV_error变量无法被外部的v_mi_error访问,PL/SQL有块级作用域限制 - 错误处理逻辑顺序错误,应该在执行DML的同一个代码块内处理异常,不需要额外的外层判断
- 没保留原逻辑中返回错误码的部分
下面是修正后的PL/SQL代码,完全对应原Sybase的逻辑:
DECLARE v_myrowcount NUMBER; -- 对应Sybase的@@rowcount,存储DELETE影响行数 v_cod_err NUMBER := 0; -- 对应Sybase的@cod_err,存储错误状态码 BEGIN -- 执行DELETE操作,和Sybase逻辑一致 DELETE table_1 WHERE N=0; -- 获取DELETE影响的行数,替代Sybase的@@rowcount v_myrowcount := SQL%ROWCOUNT; EXCEPTION -- 捕获所有异常,对应Sybase中@@error <> 0的判断 WHEN OTHERS THEN -- 设置错误状态码,对应Sybase的@cod_err=1 v_cod_err := 1; -- 抛出自定义错误,对应Sybase的raiserror -- Oracle建议自定义错误码使用-20000到-20999区间,这里沿用你原有的40900取负数形式 RAISE_APPLICATION_ERROR(-40900, 'Error: When Generating Exception List #table_1 (error= ' || SQLCODE || ')', TRUE); -- TRUE表示保留原始错误栈,方便排查问题 -- 返回错误状态码,对应Sybase的return @cod_err RETURN v_cod_err; END; /
关键对应点说明:
SQL%ROWCOUNT:替代Sybase的@@rowcount,用于获取DML语句影响的行数EXCEPTION WHEN OTHERS:替代Sybase中判断@@error <>0的逻辑,捕获所有未被显式处理的异常SQLCODE:替代Sybase的@@error,获取当前异常的错误代码RAISE_APPLICATION_ERROR:替代Sybase的raiserror,用于抛出自定义错误信息
内容的提问来源于stack exchange,提问作者mohamed
相关产品推荐
相关产品推荐

