gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:22:34 24 4
gpt4 key购买 nike

如何在 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 Communications Area (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;

    关于sql - Oracle:使用 SQL 或 PL/SQL 在动态 SQL 中查找错误的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16183290/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com