sql >> Database >  >> RDS >> Oracle

ORA-01722:Ongeldig nummer, zoek specifieke regel

De meeste SQL-clients rapporteren de regel en kolom waar de fout is opgetreden. Als je geen goede IDE bij de hand hebt, gebruik dan DBMS_SQL .

SQL-client

De meeste SQL-IDE's markeren het regel- en kolomnummer van de fout. Zelfs SQL*Plus laat precies zien waar de fout met het ongeldige getal optreedt:

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

(Helaas biedt Oracle SQL Developer deze functionaliteit niet.)

DBMS_SQL

Als uw keuze aan SQL-tools beperkt is, kunt u het relevante regelnummer nog steeds vinden met 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

(Dit antwoord gaat ervan uit dat u de SQL-instructie rechtstreeks kunt uitvoeren. Als de fout deel uitmaakt van een PL/SQL-programma, is er achteraf geen gemakkelijke manier om het regelnummer in een SQL-instructie te vinden, tenzij u het kunt uitvoeren opnieuw via DBMS_SQL . De exacte context is hier belangrijk.)



  1. Hoe PyGreSQL te installeren met Virtualenv op Mac OS Sierra

  2. `VOER ONMIDDELLIJK UIT` Oracle Statement krijgt fout

  3. ActiveRecord-groepstelling met nullen

  4. Hoe NTILE() werkt in SQL Server