私は同じ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変数を宣言できる方法はありますか?ロールバックを発行する呼び出しプロシージャの例外ブロックは
おかげ
VARCHAR2変数を非常に大きなサイズ、つまり32767に指定すると、オラクル社は自動的にVARCHAR2変数を格納します。 32767バイトを任意に設定しません。 – Ollie