2011-07-13 17 views
1

私が保守しているサイトでplsqlパッケージ/プロシージャ(Oracle 11g)を呼び出す状況があります。このプロシージャは、渡されたパラメータを使用して動的SQLの文字列を作成します(文字列「v_select」をコールします)。文字列の作成後、v_select動的SQL文字列を使用して参照カーソルが開かれます。以下の擬似コード。動的SQLが実行されたときにエラーが発生し、例外ブロックにキャッチされますか?

ここでは、例外が発生した場合の例外ブロック(WHEN OTHERS)があります。例外ブロックでは、DB内のテーブルにエラーが書き込まれます。動的SQLの実行中にエラーが発生した場合、エラーは例外ブロックで捕捉されていないようです(エラーテーブルにエントリが挿入されていません).Netレベルでエラーが表示されることがありますOracleのinvalid_numberエラーです。

最後に、私の質問は....私がオンラインで見るもの(それほど多かったわけではない)から、動的SQLチョークがあれば、これは例外ブロックによって捕捉されるべきです。これは正しいです?

答えて

4

このエラーは通常、クエリが実際に実行されるまで検出されません。このエラーは、カーソルから最初の行をフェッチするまで発生しません。生成されたSQLは論理的かつ構文的に正しい。データベース内のいくつかの行に対して無効な型変換を行うだけです。したがって、エラーはストアドプロシージャで捕捉されません。ストアドプロシージャが実行されたときにはまだ発生していません。

これは、クエリが動的であることとは関係ありません。同じクエリの非動的バージョンでも、カーソルからフェッチするまでエラーはスローされません。

+0

refカーソルは、出力パラメータとして.netレイヤーに戻されます。このエラーは決して捕まえられないと言っていますか? –

+0

ストアドプロシージャ内でカーソルからフェッチしない限り、ストアドプロシージャにはキャッチされません。これは、クエリが解釈され、クエリプランが生成されたときではなく、クエリが実行されるときに生成されるエラーです。 – antlersoft

+0

それは理にかなっています。どうもありがとうございました! –

関連する問題