加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Oracle:使用SQL或PL/SQL在动态SQL中查找错误的位置

发布时间:2020-12-12 16:30:14 所属栏目:百科 来源:网络整理
导读:如何在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使用行号显示错误,
如何在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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读