PL/SQLまたはSQLの動的SQL文でエラーの位置を見つけるにはどうすればよいですか?
SQL*Plus から、無効な SQL DML ステートメントなどのエラーの位置を確認できます。
SYS@orcl> SELECT
2 X
3 FROM
4 TABLEX
5 /
TABLEX
*
ERROR at line 4:
ORA-00942: table or view does not exist
SQL*Plus はエラーを行番号とともに表示し、エラーが見つかった行にアスタリスクを表示してマークします。
動的 SQL に変換すると、エラー コード (SQLCODE) とエラー メッセージ (SQLERRM) を取得できます。
SYS@orcl> SET SERVEROUTPUT ON
SYS@orcl> BEGIN
2 EXECUTE IMMEDIATE 'SELECT X FROM TABLEX';
3 EXCEPTION
4 WHEN OTHERS THEN
5 DBMS_OUTPUT.PUT_LINE('SQLCODE:' || SQLCODE);
6 DBMS_OUTPUT.PUT_LINE('SQLERRM:' || SQLERRM);
7 END;
8 /
SQLCODE:-942
SQLERRM:ORA-00942: table or view does not exist
しかし、動的 SQL 文字列内のエラーの位置を取得するにはどうすればよいでしょうか?
Oracle は、エラーに関する興味深い情報を含む SQL Communications Area (SQLCA) を提供しているようです。特に:
- SQLCODE および SQLERRM フィールド (それぞれの PL/SQL 関数で取得されたデータのソースである可能性があります)
- 「解析エラーオフセット」を与える SQLERRD(5) 要素がある SQLERRD フィールド。
PL/SQLまたはSQLからSQLERRDにアクセスできますか? もしそうなら、どのように?そうでない場合、PL/SQL または SQL からエラーの場所を特定できる他の手法は何ですか?
(ここでhttp://docs.oracle.com/cd/B28359_01/appdev.111/b31231/chapter8.htm#BABIGBFF SQLCA が文書化され、Pro*C でアクセスされます。)
( SQLCA.SQLERRD を宣言する方法についての回答は、SQLERRD が PL/SQL で定義されていないため、アクセスできないことを示しているようです。)
( Why doesn't Oracle tell you WHICH table or view does not exist?の議論では、トレース ファイルを使用して不正な SQL を表示し、一部の開発ツールでエラーの場所を表示するためのいくつかの提案を提供しています。)