1

因为 Sqlerrm() 返回由 orecle 提供的消息和代码。

异常 1: 当数据未找到错误 ouccers 时,就像在隐式游标中一样,我们正在编写异常处理,例如 dbms_ou..(sqlerrm());

输出: ORA-01403: 未找到数据,对于 Dbms_output..(sqlcode());--当相同的异常时未找到数据

输出: 100

异常2: 当too_many_rows异常发生时,它返回

输出:当 sqlerrm(): ORA-01422:exact fetch 返回超过请求的行数时..

输出:当sqlcode():-1422

所以,在第一种情况下 sqlcode() 返回 100 而在 too_many_rows 它返回 -1422 (这是 oracle 提供的代码)。??

所以这是我的问题什么是正确的答案。什么 sqlcode() 函数返回一些由 oracle 或任何匿名数字提供的代码?

4

2 回答 2

2

正如文档中所描述的那样,您所说的并没有什么不寻常的地方。

对于内部异常,SQLCODE 返回相关 Oracle 错误的编号。SQLCODE 返回的数字是负数,除非 Oracle 错误是找不到数据,在这种情况下 SQLCODE 返回 +100。

于 2022-02-04T06:15:04.577 回答
0

我不知道为什么 Oracle 曾经决定将 SQL 代码中的 -01403 替换为 +100。不过,这是唯一存在的例外。我们使用以下函数进行所有异常处理:

FUNCTION get_ora_code(vi_sqlcode INTEGER) RETURN INTEGER IS
BEGIN
 if vi_sqlcode = 100 then
   return -1403;
 else
   return vi_sqlcode;
 end if;
END get_ora_code;

那么我们的异常处理程序可能如下所示:

EXCEPTION WHEN OTHERS THEN
  vo_msg := regexp_replace(sqlerrm || ' ' || dbms_utility.format_error_backtrace, '[[:space:]]+', ' ');
  v_ora_code := get_ora_code(sqlcode);
  RETURN v_ora_code;
END my_package_function;

因此,我们的函数在发生错误时总是返回负值(并在输出变量 vo_msg 中报告完整的错误消息和堆栈)。我们使用返回码 0 表示成功,使用正值表示成功并发出警告(我们也在 vo_msg 中对此进行了注释)。我认为这是一个很好的代码约定。

于 2022-02-04T06:49:08.147 回答