現在、ストアドプロシージャ内のリンクされたデータベースのテーブルを参照できないという問題があります。エラーメッセージが表示されます:
ORA-00942:表またはビューが存在しません
これは、リモートデータベース(Oracle 11gを実行)へのデータベースリンクを設定するためにホストマシン(Oracle 10gを実行)で実行した手順です。手順は正確ですが、一貫性は保たれていますが、一部の名前が変更されています。
Tnsnames.oraを更新し、新しいエントリを追加します。
REMOTE_DB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)
(Host = 10.10.10.10)
(QUEUESIZE = 20)
(PORT = 1521)
)
(CONNECT_DATA =
(SERVICE_NAME = remote_service)
)
)
後でストアドプロシージャを作成して実行するユーザーとして、データベースリンクを作成します。
create database link remote_link
connect to "remote_user"
identified by "remote_pass"
using 'REMOTE_DB';
データベースリンクが機能していることを証明するには、次のリンクを選択します。
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
作業データベースリンクに依存するストアドプロシージャを作成します。
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;
次のエラーメッセージを1営業日以上見つめた後、頭を爆発させます。
Error(10,27): PL/SQL: ORA-00942: table or view does not exist
私はこの問題を整理するために、次のような多くのことを試みました。
データベースリンクを作成するときは、ユーザー名とパスワードを引用符で囲みません。リンクは正常に作成されますが、リンクから選択すると次のエラーが発生します。
ERROR at line 1:
ORA-01017: invalid username/password; logon denied
ORA-02063: preceding line from TWS_LINK
ユーザー名とパスワードのさまざまな組み合わせを大文字/小文字で試しました。 1と同じエラーを受け取りました。
ユーザー名とパスワードを二重引用符で囲むのではなく、一重引用符で囲んでみました。このエラーを受け取りました:
ERROR at line 1:
ORA-00987: missing or invalid username(s)
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への非互換性を調べることです。
OK、それで私はこれをある種の動作させることができました。
データベースリンクを作成するときに、ユーザー名とパスワードのフィールドを二重引用符で囲んで問題が発生していたことが判明しました。要約すると:
それらが存在し、リンクがそのように作成された場合:
create database link remote_link
connect to "remote_user"
identified by "remote_pass"
using 'REMOTE_DB';
二重引用符が存在しない場合:
create database link remote_link
connect to remote_user
identified by remote_pass
using 'REMOTE_DB';
したがって、リモートデータベースをSQL経由でクエリできず、無効なパスワードエラーを受け取った場合でも、これと同じ接続情報を使用するプロシージャはコンパイルされ、正常に実行されます。
きっとあなたも同意するでしょう。これは奇妙な出来事の状態であり、私は自分のシナリオでそれを機能させることに本当に遭遇しました。未回答の質問がたくさんあるので、私がそれを解決策と呼ぶかどうかはよくわかりません。
うまくいけば、誰かがグーグル経由でここに来るなら、彼らはこの答えが役に立つと思うでしょう、そして少なくとも彼らのコードを実行させるでしょう。
GC。
11gR2でも同じ問題に直面しました。問題を見つけるのを手伝ってくれたこのフォーラムに、感謝しています。 SQLとプロシージャの両方でdbリンクを機能させる方法は、以下の構文に従うことです(パスワードのみを二重引用符で囲みます)。
create database link remote_link
connect to remote_user
identified by "remote_pass"
using 'REMOTE_DB';
ここに問題があると思います。ストアドプロシージャを実行しているユーザーは、ストアドプロシージャを作成したユーザーと同じですか?
「後で実行ストアドプロシージャになるユーザーとして、データベースリンクを作成する」とおっしゃいました。
データベースリンクを作成するユーザーがストアドプロシージャを作成するユーザーと異なる場合は、それが問題である可能性があります。
同じユーザーとしてストアドプロシージャとデータベースリンクを作成するか、パブリックデータベースリンクを作成してみてください。
次に、Oracleのデフォルトは定義者権限であるため、誰でもストアドプロシージャを実行することができます(プロシージャに対する実行権限が付与されている場合)。