如何在PL / SQL或SQL中的动态SQL语句中找到错误的位置?
从SQL * Plus我看到错误的位置,例如,无效的SQL DML语句:
SYS@orcl> SELECT 2 X 3 FROM 4 TABLEX 5 / TABLEX * ERROR at line 4: ORA-00942: table or view does not exist
SQL * Plus使用行号显示错误,并打印和标记与发现错误的星号对齐.
转换为动态SQL,我可以得到错误代码(SQLCODE)和错误消息(SQLERRM):
SYS@orcl> SET SERVEROUTPUT ON SYS@orcl> BEGIN 2 EXECUTE IMMEDIATE 'SELECT X FROM TABLEX'; 3 EXCEPTION 4 WHEN OTHERS THEN 5 DBMS_OUTPUT.PUT_LINE('SQLCODE:' || SQLCODE); 6 DBMS_OUTPUT.PUT_LINE('SQLERRM:' || SQLERRM); 7 END; 8 / SQLCODE:-942 SQLERRM:ORA-00942: table or view does not exist
但是如何在动态SQL字符串中获取错误的位置?
我看到Oracle提供了一个SQL通信区域(SQLCA),其中包含有关错误的有趣信息.特别是:
> SQLCODE和SQLERRM字段(可能是使用相应PL / SQL函数检索的数据的来源),
> SQLERRD字段,其中SQLERRD(5)元素给出’解析错误偏移’.
是否可以从PL / SQL或SQL访问SQLERRD?如果是这样,怎么样?如果没有,还有哪种技术可以从PL / SQL或SQL中提供错误的位置?
(这里http://docs.oracle.com/cd/B28359_01/appdev.111/b31231/chapter8.htm#BABIGBFF SQLCA已记录并使用Pro * C进行访问.)
(这里的答案how to declare SQLCA.SQLERRD?似乎表明SQLERRD没有在PL / SQL中定义,因此无法访问.)
(这里的讨论Why doesn’t Oracle tell you WHICH table or view does not exist?给出了一些建议,用于显示使用跟踪文件的错误SQL并在一些开发工具中显示错误的位置.)
你有一个用于在
dbms_utility中提取错误消息的包
begin .. generate error exception when others then dbms_output.put_line( dbms_utility.format_call_stack() || chr(10) || dbms_utility.format_error_backtrace() || chr(10) || dbms_utility.format_error_stack()) end;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。