0

DB リンクを介して別のデータベースからデータをフェッチし、それに対していくつかのアクションを実行する PL SQL を作成する必要があります。

DECLARE
   CURSOR cur_progs
   IS
      SELECT *
        FROM allen.table_dummy@db_link;

BEGIN
    ... 
    ...
END;
/

上記の例では、2 つの問題に直面しました。

リンクが作成されていない場合、以下のエラーメッセージがスローされます

ORA-04054: database link db_link does not exist

リンクは存在するが、リンクを作成するユーザーのパスワードの有効期限が切れている場合、以下のエラー メッセージがスローされます。

ORA-04052: error occurred when looking up remote object allen.table_dummy@db_link ORA-00604: error occurred at recursive SQL level 1 ORA-01017: invalid username/password; logon denied ORA-02063: preceding line from db_link

これらの両方のエラーをキャッチする方法はありますか? PLSQLブロック内にPLSQLブロックを書くようなもの。

4

2 に答える 2

3

あなたが得ているエラーはコンパイルエラーです。コンパイル エラーをキャッチすることはできません (これは、PL/SQL だけでなく、どの言語でも当てはまります)。

本当に決心している場合は、動的 SQL を使用するようにコードを変更して、エラーをコンパイル エラーから実行時エラーに変えることができます。これは、例外ハンドラーでエラーをキャッチできることを意味します。しかし、そうするのは本当に悪い考えのようです。

まず、エラーが実行時またはコンパイル時にスローされるかどうかにかかわらず、エラーは致命的であるように見えます。データベース リンクが存在しない場合、またはパスワードが無効な場合、例外ハンドラーで何か有用なことを実行できる可能性はほとんどないようです。予想される例外のみをキャッチする必要があり、有用なことを行うことができることを考えると、これらのエラーをキャッチすることが有用である可能性は非常に低いようです。

第 2 に、静的 SQL から動的 SQL に移行すると、通常、コードの作成と保守が難しくなります。さらに、コードの効率と安全性が低下することがよくあります。

于 2013-06-12T07:20:45.777 に答える
0

考慮すべき 1 つのオプション:

データベース リンクが正常に機能している時間を選択してから、ストアド プロシージャをコンパイルします (できればパッケージで)。そうすれば、プロシージャが有効なコンパイル状態にあることがわかります。

次に、動的 SQL を使用してクエリを実行する簡単なストアド プロシージャを作成しますDUAL@db_link。実行時にこれを呼び出して、プロシージャを実行する前にリンクをテストします。リンクがダウンしていても、この手順は無効とはマークされません。

リンクが一時的にダウンした場合、メインのストアド プロシージャは、コンパイルを試みない限り、無効とマークされません。

于 2013-06-12T07:33:50.720 に答える