ほとんどの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
を介して 。ここでは正確なコンテキストが重要です。)