sql >> データベース >  >> RDS >> Oracle

ORA-01722:番号が無効です。特定の行を検索してください

    ほとんどのSQLクライアントは、エラーが発生した行と列を報告します。優れたIDEが手元にない場合は、DBMS_SQLを使用してください。 。

    SQLクライアント

    ほとんどのSQLIDEは、エラーの行番号と列番号を強調表示します。 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 Developerはこの機能を提供していません。)

    DBMS_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
    

    (この回答は、SQL文を直接実行できることを前提としています。エラーがPL / SQLプログラムの一部である場合、実行できない限り、SQL文内の行番号を見つける簡単な方法はありません。再びDBMS_SQLを介して 。ここでは正確なコンテキストが重要です。)



    1. BadStoreでのSQLインジェクション

    2. OracleのDBMS_ASSERTに相当するSQLServerとは何ですか?

    3. ネストされている間およびネストされている場合のコンサルテーションプログラミング

    4. デフォルトのパラメータ値としてのSQL関数?