ORA-01722: Неверный номер, найти строку c - PullRequest
1 голос
/ 15 января 2020

У меня довольно большой выбор, который выдает ошибку ORA-01722: Invalid Number. Сама ошибка ясна, но я не знаю точную строку, которая ее выбрасывает.

Есть ли способ узнать точную строку? Я действительно не хочу просматривать весь выбор и сравнивать типы, поскольку это заняло бы очень одинокое время.

Ответы [ 3 ]

0 голосов
/ 15 января 2020

В большинстве случаев я встречал две причины для такого поведения. Оба находятся в области WHERE

  1. При сравнении числа со строковым столбцом, например

    , где order_num = 2000

, имеющий Столбец order_num определен как varchar2. В этом случае выполнение завершается сбоем, когда дело доходит до номера заказа, такого как «1689_new» или около того.

при сравнении числового столбца со строковым столбцом,

где имя = возраст

Во втором случае я получил столбцы с похожим именем (таблица .order_num и table1.order_num), но с разными типами данных (varchar2 и number)

Поэтому я всегда проверяю состояние фильтра, комментируя их. Сначала жестко запрограммированные значения (см. 1, выше), затем имена столбцов.

all_tab_cols полезен для быстрой проверки типа данных

0 голосов
/ 16 января 2020

Большинство SQL клиентов сообщат строку и столбец, где произошла ошибка. Если у вас нет удобной IDE, используйте DBMS_SQL.

SQL Client

Большинство 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 Разработчик не предоставляет эту функциональность.)

СУБД_ 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

(Этот ответ предполагает, что вы можете напрямую запустить * Оператор 1027 *. Если ошибка является частью программы PL / SQL, то после факта нет простого способа найти номер строки внутри оператора SQL, если только вы не сможете запустить его снова через DBMS_SQL. Точный контекст здесь важен.)

0 голосов
/ 15 января 2020

Вы должны выполнить бинарный поиск (отметка половины столбцов, отфильтровать половину данных), чтобы найти столбец и строку, где происходит сбой. К сожалению, нет лучшего способа отладки одного оператора SQL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...