首页 > 解决方案 > ORA-01722: 无效编号,查找特定行

问题描述

我有一个相当大的选择会引发ORA-01722: Invalid Number 错误。错误本身很清楚,但我不知道引发它的确切行。

有没有办法找出确切的线路?我真的不想浏览整个选择并比较类型,因为这需要很长时间。

标签: sqloracle

解决方案


大多数 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。确切的上下文在这里很重要。)


推荐阅读