sql >> Base de Datos >  >> RDS >> Oracle

ORA-01722:Número no válido, busque una línea específica

La mayoría de los clientes de SQL informarán la línea y la columna donde ocurrió el error. Si no tiene un buen IDE a mano, use DBMS_SQL .

Cliente SQL

La mayoría de los IDE de SQL resaltarán el número de línea y columna del error. Incluso SQL*Plus muestra exactamente dónde ocurre el error de número no válido:

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

(Desafortunadamente, Oracle SQL Developer no proporciona esta funcionalidad).

DBMS_SQL

Si su elección de herramientas SQL es limitada, aún puede encontrar el número de línea relevante usando 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

(Esta respuesta asume que puede ejecutar directamente la declaración SQL. Si el error es parte de un programa PL/SQL, entonces no hay una manera fácil de encontrar el número de línea dentro de una declaración SQL, a menos que pueda ejecutarlo). de nuevo a través de DBMS_SQL . El contexto exacto es importante aquí.)