因为Sqlerrm()返回由orecle提供的消息和代码。
异常1:类似于在隐式游标中,当数据未找到错误时,我们正在编写异常处理,如dbms_ou.(sqlerrm());
输出: ORA-01403:没有找到数据,Dbms_output.(sqlcode());-当相同的异常时没有找到数据
输出: 100
异常2:当too_many_rows异常发生时将返回
输出:当sqlerrm():ora-01422 :返回的次数超过请求的行数.
输出:当sqlcode():-1422时
因此,在第一种情况下sqlcode()返回100,在too_many_rows中返回-1422 (这是oracle提供的代码)。??
所以这就是我的问题,什么是正确的答案。哪个sqlcode()函数返回由oracle或任何匿名数字提供的大量代码??
发布于 2022-02-04 06:15:04
你所说的没有什么不寻常的,正如在 文档中所描述的那样。
对于内部异常,SQLCODE返回关联的Oracle错误数。除非没有找到数据,否则SQLCODE返回的数字为负数,在这种情况下,SQLCODE返回+100。
发布于 2022-02-04 06:49:08
我不知道为什么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;因此,在发生错误时,我们的函数总是返回一个负值(并在out变量vo_msg中报告完整的错误消息和堆栈)。我们使用返回代码0表示成功,使用正值表示成功,并使用警告(我们在vo_msg中也对此进行了注释)。我认为这是一个很好的代码约定。
https://stackoverflow.com/questions/70982003
复制相似问题