2011-02-07 11 views
2

迅速かつ直接的な質問:PL/SQLからのエラーの返信

私はPL/SQLストアド・プロシージャを作成しています。それには、失敗するかもしれないexecute immediateコールが含まれています。私はエラーを起こしたくありません。私はストアドプロシージャが正常に実行を終了し、エラーの一覧を返すようにしたいと思います。次のようなものがあります。

for vRecord in vCursor 
loop 
    begin 
     execute immediate 'insert into t(a) values (' || vRecord.val || ')'; 
    when others then 
     -- store the error somewhere to return it!! 
    end; 
end loop; 

私の質問は、これらのエラーを返すための推奨方法は何ですか?テーブル? outパラメータ?

ありがとうございます。

答えて

3

うわー、私はちょうど別のスレッドで似たような質問に答えました。あなたが特別にすべてのエラーを保存するためにDMLエラー・ロギングを使用することができ、以降のバージョン10gリリース2からhere

+0

ありがとうございました!私はそれを考えました。それが最高のオプションかどうかわからない。とにかく、エラーを返すためにTABLEを使うのはオーバーキルのようです...とにかく、提案してくれてありがとう! –

+0

エラーをログに記録するのはやめましょう、良い習慣;そして、あなたは何らかの頻度で実行されるものと仮定して、何が起こっているのかについての監査証跡を持っています。 – tbone

+0

実際には、SQLERRMの代わりにdbms_utility.format_error_stack || dbms_utility.format_error_backtraceのようなものを使用してください。 –

3

を参照してください

:LOGテーブルを使用して、あなたは、単にエラー(またはメッセージ)をログに記録する場合に自律型トランザクションを使用します表。あなたはここでそれについて読むことができます。

http://download.oracle.com/docs/cd/E11882_01/appdev.112/e16760/d_errlog.htm#ARPLS680

をあなたが投稿したコードに基づいて、他のいくつかのアドバイス:

1)それはここに、動的SQLを使用する必要はありません。

insert into t(a) values (vRecord.val); 

2)ここでループを使用する必要はありません。だけではなく、SELECT/INSERTを使用します。

insert into t(a) select [the query from your vCursor here] 

よろしく、
ロブ。

+0

ロブのお返事ありがとうございました。 DMLエラー・ロギングを見ていきます。ご協力いただきありがとうございます。しかし、私が投稿したのは単なるサンプルコードです。私の実際のコードは**動的SQLを必要とします**。 –

+0

Oracle独自の機能を使用するのではなく、常にOracleの組み込み機能を使用することをお勧めします。しかし、動的SQLでDMLエラー・ロギングを使用するのは簡単ではありません。 SQLがどのように動的であるかによって異なります... – APC

+0

True。この場合のテーブル - tは動的であってはいけません:-) –

関連する問題