作为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提供的代码(。??
这就是我的问题,什么是正确的ans。哪个sqlcode((函数返回oracle提供的大量代码或任何匿名数字??
正如文档中所描述的,您所说的没有什么异常。
对于内部异常,SQLCODE返回相关Oracle错误的编号。除非Oracle错误未找到数据,否则SQLCODE返回的数字为负数,在这种情况下,SQLCODE将返回+100。
我不知道为什么Oracle曾经决定用+100替换SQL代码中的-01403。不过,这是唯一存在的例外。我们使用以下功能进行所有异常处理:
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中对此进行了注释(。我认为这是一个很好的代码约定。