【发布时间】:2013-04-24 04:17:25
【问题描述】:
如何在 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,并在某些开发工具中显示错误的位置。)
【问题讨论】: