2011-11-08 6 views
2

私は同じpl/sqlパッケージ内の別のプロシージャから呼び出す次の関数を持っています。私は関数を呼び出すときpl/sqlの例外ブロック '関数'がエラー状態をキャッチしない

Function lf_get_query(p_table in varchar2) return varchar2 
Is 
    v_where_clause varchar2(500); 
Begin 
    Case upper(p_table) 
     When 'TABLEA' then      
      v_where_clause := ' Where trunc(x.purchase_dtm) < ' || '''' || trunc(v_check_Date) || ''''; 
     When 'TABLEB' then      
      v_where_clause := ' Where trunc(x.purchase_dtm) < ' || '''' || trunc(v_check_Date) || '''' 
           || ' And product_type='ABC' 
           || ' And customer_type='XXX' 
           || ' And contract_type='YYY'; 
     Else 
      raise ex_unknown_table_type;      
    End case;   
    return v_where_clause; 
Exception 
    When ex_unknown_table_type then 
     [[Log to file that table is urecognised. ]] 
     raise; 
    When others then 
     [[Log to file that table is urecognised and include sqlerrm ]] 
     raise; 
End; 

は、それが次のエラーを生成します。

ORA-06502: PL/SQL: numeric or value error: character string buffer too small 

変数v_where_clauseは私が保存しようとしていた文字列のいくつかのために十分な大きさではないため、エラーが生成されます変数。私が理解していないのは、エラーが発生したときで、上に示した2つの例外節のいずれにも当てはまらないときです。代わりに、この関数を呼び出すプロシージャの例外ブロックでエラーが発生しています。

私がそれが関数内の例外句によって捕捉されていないことがわかっている理由は、両方の例外句がエラー条件をファイルに記録することになっているが、そうではないということです。

これには何らかの理由がありますか?例外が 'その他の例外'例外ブロックによってキャッチされるべきではありませんか?

また、サイズを指定せずにv_where_clause変数を宣言できる方法はありますか?ロールバックを発行する呼び出しプロシージャの例外ブロックは

おかげ

+0

VARCHAR2変数を非常に大きなサイズ、つまり32767に指定すると、オラクル社は自動的にVARCHAR2変数を格納します。 32767バイトを任意に設定しません。 – Ollie

答えて

4

ですか?そうであれば、それは他のすべてと一緒にあなたのロギングをロールバックします。これを回避する方法は、PRAGMA AUTONOMOUS_TRANSACTIONで定義されたプロシージャを使用することです。このプロシージャを使用すると、現在のトランザクション外でロギングが発生する可能性があります。

+0

ああ、私はとても愚かです。テーブルに記録されたログエントリはロールバックされていました。ありがとう!!!!!!!! – ziggy

+2

私たち全員に少なくとも一度は起こります;-) – DCookie

+0

+1ログレコードを書くことは、AUTONOMOUS TRANSACTIONの*唯一の有効な使い方です。 – APC

関連する問題