Oracle
 sql >> Base de données >  >> RDS >> Oracle

ORA-01722 :Numéro non valide, recherchez une ligne spécifique

La plupart des clients SQL signaleront la ligne et la colonne où l'erreur s'est produite. Si vous n'avez pas un bon IDE à portée de main, utilisez DBMS_SQL .

Client SQL

La plupart des IDE SQL mettront en surbrillance le numéro de ligne et de colonne de l'erreur. Même SQL*Plus montre exactement où l'erreur de numéro invalide se produit :

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

(Malheureusement, Oracle SQL Developer ne fournit pas cette fonctionnalité.)

SGBD_SQL

Si votre choix d'outils SQL est limité, vous pouvez toujours trouver le numéro de ligne pertinent en utilisant 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

(Cette réponse suppose que vous pouvez exécuter directement l'instruction SQL. Si l'erreur fait partie d'un programme PL/SQL, il n'y a pas de moyen facile après coup de trouver le numéro de ligne dans une instruction SQL, à moins que vous ne puissiez l'exécuter à nouveau via DBMS_SQL . Le contexte exact est important ici.)