2013-04-24 3 views
6

PL/SQLまたはSQLの動的SQL文でエラーの位置を確認するにはどうすればよいですか? SQLからOracle:SQLまたはPL/SQLを使用して動的SQLでエラーの位置を見つける

* Plusの私には、例えば、無効なSQL DML文でのエラーの位置を参照してください。

[email protected]> 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)を取得することができます

[email protected]> SET SERVEROUTPUT ON 
[email protected]> 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コミュニケーション領域(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で文書化され、アクセスされます。)

(答えはここhow to declare SQLCA.SQLERRD? SQLERRDは、PL/SQL、したがって、アクセスできないで定義されていないことを示していると思われる。)

Why doesn't Oracle tell you WHICH table or view does not exist?は、トレースファイルを使用して不正なSQLを表示し、一部の開発ツールでエラーの場所を表示するための提案を表示します)。

答えて

1

ダイナミックPL/SQLでステートメントを実行すると、 。

例えば、この文は、4行目にエラーがあります。

declare 
    v_count number; 
    v_bad_sql varchar2(32767) := 
     'SELECT 
      X 
      FROM 
      TABLEX'; 
begin 
    execute immediate v_bad_sql into v_count; 
exception when others then 
    begin 
     execute immediate 
      'begin for i in ('||v_bad_sql||') loop null; end loop; end;'; 
    exception when others then 
     dbms_output.put_line(sqlerrm); 
    end; 
end; 
/

ORA-06550: line 4, column 4: 
PL/SQL: ORA-00942: table or view does not exist 
ORA-00942: table or view does not exist 
ORA-06550: line 1, column 18: 
PL/SQL: SQL Statement ignored 
ORA-00942: table or view does not exist 

この方法にはいくつかの欠点があります

  1. それは例外と再をキャッチするためにいくつかの余分な、醜いコードが必要ですがSQLを試してください。
  2. この例は選択に対してのみ機能します。挿入、更新、削除、マージ、動的PL/SQLなどのためにそれを微調整する必要があります。通常、どのような種類のSQL文であるかを知っている必要があります。不運な場合は、文を解析する必要がありますが、これは非常に困難です。
  3. PL/SQL文全体が1行にある場合は、列番号が正しくありません。
+0

にエラーメッセージを抽出するためのパッケージを得ましたアスタリスク私は行と列の数を得るためにエラースタックを解析することによって必要なものを得ることができますが、より簡単な方法がありますか? –

+0

私が知る限り、より簡単な方法はありません。 –

3

私は問題のあるラインとマークが付き、問題のスタートだ別のラインを印刷することにより、SQL * Plusでの動作を模倣しようとしているdbms_utility

begin 
    .. generate error 
exception when others then 
    dbms_output.put_line(
     dbms_utility.format_call_stack()  || chr(10) || 
     dbms_utility.format_error_backtrace() || chr(10) || 
     dbms_utility.format_error_stack()) 
end; 
+2

SQLフィーリングの例:http://www.sqlfiddle.com/#!4/471dd/1 – ThinkJet

+1

DBMS_UTILITYだけでは、動的SQL文内の行番号*を見つけるには不十分です。 @ ThinkJetの2番目のブロックは動作しますが、動的SQLブロックにSQLをラップするのはまだ難しいです。 (最初のブロックは必ずしも機能しません。たとえば、テーブル名が間違っているなど、解析エラーの正しい行番号を取得できません)。 –

関連する問題