如何在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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
但是如何在动态SQL字符串中获取错误的位置?
我看到Oracle提供了一个SQL通信区域(SQLCA),其中包含有关错误的有趣信息.特别是:
是否可以从PL/SQL或SQL访问SQLERRD?如果是这样,怎么样?如果没有,还有哪种技术可以从PL/SQL或SQL中提供错误的位置?
(此处http://docs.oracle.com/cd/B28359_01/appdev.111/b31231/chapter8.htm#BABIGBFF记录了SQLCA并使用Pro*C进行访问.)
(这里的答案如何声明SQLCA.SQLERRD?似乎表明SQLERRD没有在PL/SQL中定义,因此无法访问.)
(这里的讨论为什么Oracle没有告诉你WHICH表或视图不存在?给出了一些建议,用于显示使用跟踪文件的错误SQL并在一些开发工具中显示错误的位置.)
通过动态 PL/SQL 运行语句会将相关行号存储在错误堆栈中。
例如,该语句在第 4 行有错误:
declare
v_count number;
v_bad_sql varchar2(32767) :=
'SELECT
X
FROM
TABLEX';
begin
execute immediate v_bad_sql into v_count;
exception when others then
begin
execute immediate
'begin for i in ( '||v_bad_sql||') loop null; end loop; end;';
exception when others then
dbms_output.put_line(sqlerrm);
end;
end;
/
ORA-06550: line 4, column 4:
PL/SQL: ORA-00942: table or view does not exist
ORA-00942: table or view does not exist
ORA-06550: line 1, column 18:
PL/SQL: SQL Statement ignored
ORA-00942: table or view does not exist
Run Code Online (Sandbox Code Playgroud)
这种方法有一些缺点:
| 归档时间: |
|
| 查看次数: |
4560 次 |
| 最近记录: |