如何查找 PL/SQL 异常的确切列名

How to find the exact column name for the PL/SQL exception

提问人:Scripta14 提问时间:1/22/2021 更新时间:1/22/2021 访问量:519

问:

我有一个 plsql 过程将值插入表中,但是当我运行代码时,我会收到此错误:“ORA-01438:值大于指定精度允许此列”。 为了找出正确的错误点,我在 INSERT EXCEPTION 中输入了一个DBMS_UTILITY。FORMAT_ERROR_BACKTRACE确定我遇到问题的确切行。

exception
     when others then
       dbms_output.put_line('sqlcode:sqlerrm' || sqlcode || ':' || sqlerrm);
       dbms_output.put_line('DBMS_UTILITY.FORMAT_ERROR_BACKTRACE' || BMS_UTILITY.FORMAT_ERROR_BACKTRACE);

这很有用,因为现在我知道哪一行有错误,但获取列名的方法会更好。 我在网上寻找一种方法,我发现了这一点:如何获取PL / SQL对象填充失败的列名。 有没有其他简单的方法可以做到这一点?我不想在我的代码中使用对象。

Oracle PLSQL

评论

0赞 Thomas Kirchhoff 1/23/2021
请看 Steven Feuerstein 的这个短视频(捕获调用堆栈、错误代码、错误堆栈、错误回溯):[链接] (youtube.com/watch?v=Q33gRojvHIg)
0赞 the_slk 1/23/2021
-- 你可以用 errlog BEGIN dbms_errlog.create_error_log(dml_table_name => 'table_name');结束;INSERT INTO table_name SELECT * FROM source_table_name LOG ERRORS INTO err$_table_name ('INSERT') 拒绝限制 UNLIMITED;
0赞 Jon Heller 1/25/2021
这只是您要调试的一次性错误吗?如果是这样,最简单的解决方案可能是提取 SQL 语句并直接在 SQL*Plus 等工具中运行它,或者通过 DBMS_SQL 运行它,如此所述。这两种方法都不会提供列名,但它们提供了行号和列号,这应该足以进行临时分析。(另外,我同意您可能不想使用您链接到的其他答案。将对象关系代码引入系统应该是最后的手段。

答: 暂无答案