sql >> Databáze >  >> RDS >> Oracle

ORA-01722:Neplatné číslo, vyhledejte konkrétní řádek

Většina klientů SQL hlásí řádek a sloupec, kde došlo k chybě. Pokud nemáte po ruce dobré IDE, použijte DBMS_SQL .

Klient SQL

Většina SQL IDE zvýrazní číslo řádku a sloupce chyby. Dokonce i SQL*Plus přesně ukazuje, kde se chyba neplatného čísla vyskytuje:

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 bohužel tuto funkci neposkytuje.)

DBMS_SQL

Pokud je váš výběr nástrojů SQL omezený, můžete stále najít příslušné číslo řádku pomocí 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

(Tato odpověď předpokládá, že můžete přímo spustit příkaz SQL. Pokud je chyba součástí programu PL/SQL, pak neexistuje snadný způsob, jak najít číslo řádku uvnitř příkazu SQL, pokud jej nejste schopni spustit znovu přes DBMS_SQL . Zde je důležitý přesný kontext.)



  1. SQLSTATE[42000] Chyba syntaxe nebo narušení přístupu Velikost řádku je příliš velká

  2. PostgreSQL - Jak vložit řetězce obrázků Base64 do sloupce BYTEA?

  3. Jak získat první a poslední den předchozího měsíce (s časovým razítkem) na SQL Server

  4. Získejte první znaky z řetězce