web-dev-qa-db-ja.com

Oracle:ストアドプロシージャでデータベースリンクを使用する:テーブルまたはビューが存在しない

現在、ストアドプロシージャ内のリンクされたデータベースのテーブルを参照できないという問題があります。エラーメッセージが表示されます:

ORA-00942:表またはビューが存在しません

これは、リモートデータベース(Oracle 11gを実行)へのデータベースリンクを設定するためにホストマシン(Oracle 10gを実行)で実行した手順です。手順は正確ですが、一貫性は保たれていますが、一部の名前が変更されています。

  1. Tnsnames.oraを更新し、新しいエントリを追加します。

    REMOTE_DB =
        (DESCRIPTION =
            (ADDRESS = (PROTOCOL = TCP)
                       (Host = 10.10.10.10)
                       (QUEUESIZE = 20)
                       (PORT = 1521)
            )
            (CONNECT_DATA =
                       (SERVICE_NAME = remote_service)
            )
        )
    
  2. 後でストアドプロシージャを作成して実行するユーザーとして、データベースリンクを作成します。

    create database link remote_link
    connect to "remote_user"
    identified by "remote_pass"
    using 'REMOTE_DB';
    
  3. データベースリンクが機能していることを証明するには、次のリンクを選択します。

    select id from remote_table@remote_link;
    
    id
    --------------------------------------------------------------------------------
    8ac6eb9b-fcc1-4574-8604-c9fd4412b917
    c9e7ee51-2314-4002-a684-7817b181267b
    cc395a81-56dd-4d68-9bba-fa926dad4fc7
    d6b450e0-3f36-411a-ba14-2acc18b9c008
    
  4. 作業データベースリンクに依存するストアドプロシージャを作成します。

    create or replace
    PROCEDURE test_remote_db_link
    AS
    v_id varchar(50);
    BEGIN   
        select id into v_id from remote_table@remote_link where id = 'c9e7ee51-2314-4002-a684-7817b181267b';
        dbms_output.put_line('v_id : ' || v_id);
    END test_remote_db_link;
    
  5. 次のエラーメッセージを1営業日以上見つめた後、頭を爆発させます。

    Error(10,27): PL/SQL: ORA-00942: table or view does not exist
    

私はこの問題を整理するために、次のような多くのことを試みました。

  1. データベースリンクを作成するときは、ユーザー名とパスワードを引用符で囲みません。リンクは正常に作成されますが、リンクから選択すると次のエラーが発生します。

    ERROR at line 1:
    ORA-01017: invalid username/password; logon denied
    ORA-02063: preceding line from TWS_LINK
    
  2. ユーザー名とパスワードのさまざまな組み合わせを大文字/小文字で試しました。 1と同じエラーを受け取りました。

  3. ユーザー名とパスワードを二重引用符で囲むのではなく、一重引用符で囲んでみました。このエラーを受け取りました:

    ERROR at line 1:
    ORA-00987: missing or invalid username(s)
    
  4. Sqlplusを使用してリモートデータベースに接続することにより、リモートデータベースに完全にアクセスできることが証明されました。

    [Oracle]$ sqlplus remote_user/remote_pass@REMOTE_DB
    
    SQL*Plus: Release 10.2.0.1.0 - Production on Thu Oct 20 22:23:12 2011
    
    Copyright (c) 1982, 2005, Oracle.  All rights reserved.
    
    
    Connected to:
    Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options
    
    SQL> 
    

次に何をすればいいのかわかりません。考えられる次のステップは、リモートデータベースの問題の調査を開始し、おそらく他のデータベースがそれに接続できるかどうかを確認することです。もう1つは、ホスト10gからリモート11gへの非互換性を調べることです。

11
Clarkey

OK、それで私はこれをある種の動作させることができました。

データベースリンクを作成するときに、ユーザー名とパスワードのフィールドを二重引用符で囲んで問題が発生していたことが判明しました。要約すると:

それらが存在し、リンクがそのように作成された場合:

create database link remote_link
connect to "remote_user"
identified by "remote_pass"
using 'REMOTE_DB';
  1. リモートデータベースcould sqlを介してクエリ
  2. ストアドプロシージャできませんでしたコンパイルして、ORA-942エラーを受け取ります
  3. プロシージャをコンパイルできなかったため、実行できませんでした

二重引用符が存在しない場合:

create database link remote_link
connect to remote_user
identified by remote_pass
using 'REMOTE_DB';
  1. リモートデータベースできませんでした sqlを介してクエリされ、無効なパスワードエラーを受け取ります(質問で詳しく説明されています)
  2. ストアドプロシージャcouldエラーなしでコンパイルできます。
  3. ストアドプロシージャ期待どおりに実行、データベースリンク全体からデータを取得し、表示します。

したがって、リモートデータベースをSQL経由でクエリできず、無効なパスワードエラーを受け取った場合でも、これと同じ接続情報を使用するプロシージャはコンパイルされ、正常に実行されます。

きっとあなたも同意するでしょう。これは奇妙な出来事の状態であり、私は自分のシナリオでそれを機能させることに本当に遭遇しました。未回答の質問がたくさんあるので、私がそれを解決策と呼ぶかどうかはよくわかりません。

うまくいけば、誰かがグーグル経由でここに来るなら、彼らはこの答えが役に立つと思うでしょう、そして少なくとも彼らのコードを実行させるでしょう。

GC。

6
Clarkey

11gR2でも同じ問題に直面しました。問題を見つけるのを手伝ってくれたこのフォーラムに、感謝しています。 SQLとプロシージャの両方でdbリンクを機能させる方法は、以下の構文に従うことです(パスワードのみを二重引用符で囲みます)。

create database link remote_link
connect to remote_user
identified by "remote_pass"
using 'REMOTE_DB';
4
Sanjog

ここに問題があると思います。ストアドプロシージャを実行しているユーザーは、ストアドプロシージャを作成したユーザーと同じですか?

「後で実行ストアドプロシージャになるユーザーとして、データベースリンクを作成する」とおっしゃいました。

データベースリンクを作成するユーザーがストアドプロシージャを作成するユーザーと異なる場合は、それが問題である可能性があります。

同じユーザーとしてストアドプロシージャとデータベースリンクを作成するか、パブリックデータベースリンクを作成してみてください。

次に、Oracleのデフォルトは定義者権限であるため、誰でもストアドプロシージャを実行することができます(プロシージャに対する実行権限が付与されている場合)。

2
Mark J. Bobak