sql - ORA-01722: 无效编号,查找特定行
问题描述
我有一个相当大的选择会引发ORA-01722: Invalid Number
错误。错误本身很清楚,但我不知道引发它的确切行。
有没有办法找出确切的线路?我真的不想浏览整个选择并比较类型,因为这需要很长时间。
解决方案
大多数 SQL 客户端会报告发生错误的行和列。如果您手边没有好的 IDE,请使用DBMS_SQL
.
SQL 客户端
大多数 SQL IDE 会突出显示错误的行号和列号。甚至 SQL*Plus 也能准确显示出现无效数字错误的位置:
SQL> select *
2 from dual
3 where 1 = 1
4 and 1 = 'a'
5 and 2 = 2;
and 1 = 'a'
*
ERROR at line 4:
ORA-01722: invalid number
(遗憾的是,Oracle SQL Developer 不提供此功能。)
DBMS_SQL
如果您选择的 SQL 工具有限,您仍然可以使用DBMS_SQL.LAST_ERROR_POSITION
.
declare
v_sql clob := q'[
select *
from dual
where 1 = 1
and 1 = 'a'
and 2 = 2
]';
v_cursor integer;
v_ignore number;
begin
v_cursor := dbms_sql.open_cursor;
dbms_sql.parse(v_cursor, v_sql, dbms_sql.native);
v_ignore := dbms_sql.execute(v_cursor);
exception when others then
dbms_output.put_line(sqlerrm);
dbms_output.put_line('Error starts here: '||
substr(v_sql, dbms_sql.last_error_position));
end;
/
Results:
ORA-01722: invalid number
Error starts here: 'a'
and 2 = 2
(这个答案假设您可以直接运行 SQL 语句。如果错误是 PL/SQL 程序的一部分,那么事后没有简单的方法可以在 SQL 语句中找到行号,除非您能够运行它再次通过DBMS_SQL
。确切的上下文在这里很重要。)
推荐阅读
- python - ValueError:数据必须为正(boxcox scipy)
- qt - 如何在 WebEngineView 中呈现的 html 文件中弹出文件对话框/打印对话框?
- ruby-on-rails - 单个型号的carrierwave多个上传器
- java - java中实例变量和实例的区别
- sql - 水晶公式:具有多个条件的 if/then/else 语句
- javascript - 理解 NodeJS 中的异步和 Promise
- python - AttributeError:“元组”对象没有属性“emp_info”
- firebase - 如何使用 Firebase 在 Flutter 中进行电话身份验证?
- ruby - 使 Gem::Specification.find_by_name 返回正确的 gem 版本
- jpeg - 带有伪造霍夫曼表的 jpeg 可以恢复吗?