2011-01-14 291 views
6

私はいくつかのソリューションを検索しました。そのうちの一つは、以下の通りです:ORA-02069この操作ではglobal_namesパラメータをTRUEに設定する必要があります

原因 文のリモートマッピングが必要とされているが、それは

アクション 問題は、セッションを変更するに達成されるためにGLOBAL_NAMESがTRUEに設定する必要がありますので、達成することができませんset global_names = true(可能な場合)

しかし、私はなぜglobal_namesパラメータを設定する必要があるのか​​理解できません...リモートマッピングでglobal_namesパラメータを使用するのはなぜですか?どうか、私を説明できますか?

P.S私はglobal_namesパラメータを設定すると、データベースのリンク名がリモートデータベース名と同じでなければならないことがわかっています。また、<DB_NAME>のようにデータベース名にドメイン名を追加します。 <DB_DOMAIN>他に何がありますか?

+0

このエラーが発生したときに何をしようとしていますか(コードのどの行)ですか? –

+0

ご回答いただきありがとうございます...私はdblink経由で行を挿入しようとしています...私のSQL文の一部は、この挿入がtmp_b_transfer_amt @ xl02 select(select acc.acct_no from [email protected] ... – kupa

+0

実際のアドバイスとして、** @ user_name **を使用してメッセージを開始すると、あなたのコメントへの返答が速くなります。**のように**使用されているDBリンクを作成する前にコードを使用してください(コメントではなく、オリジナルの投稿に追加してください) –

答えて

8

答えがここで議論された:場合リンクにhttp://dba010.wordpress.com/2011/01/05/oracle-errorsora/#ORA-02069

は動作しません:

エラー:

ORA-02069:GLOBAL_NAMESをこの操作では、パラメータをTRUEに設定する必要があります。

原因:

あなたは地元の機能を使用してリモート・データベースでDML操作をしようとしています。

これは「Oracle Bug」ですが、動作するはずですが、そうではありません。

例(よりよく理解するために):

-assume我々は二つのデータベースDB1とDB2我々が持っている

-On DB1我々が持っている機能のFUN1

create function fun1 return number is 
begin 
return 1; 
end; 

-On DB1を持っていますDB2を参照するデータベース・リンクは、簡単のために、DB2と呼ばれています。

- 動作することを確認してください。

select * 
from [email protected] 

- 出力が次の場合は動作します。

DUMMY 
----- 
X 

-LEtの

create table tesTable(
id   number, 
testColumn number 
); 

(DB2データベースに接続)DB2のテストテーブルを作成-LEtのこのORA-02069エラーが発生しなければならないいくつかのDML操作を、作ります。

insert into [email protected](id,testColumn) 
values(1, fun1); 



“ORA-02069: global_names parameter must be set to TRUE for this operation” 

ここで、このエラーがどのような状況で発生しているかを知っていれば、解決策を書きましょう。これは、2つのソリューションがあります。

策1:trueにGLOBAL_NAMESパラメータを設定

  1. 、それは
  2. (そのセッションレベルは時々利用できません考える)、システムレベルまたはセッションレベルで行うことができます

--on DB1

alter session set global_names=true; 
  1. DB2の場合、データベースDB1(データベースのグローバル名と同じリンク名を指定します。これはglobal_namesパラメータにtrueを設定する必要があるため)を参照する、データベースのリンクを作成します。

-On DB2

Create database link DB1 connect to <username> identified by <password> 
using ‘DB1’; 

今では動作するはずですが、ので、それは、あなたはなぜ推測する必要があります(セキュリティで保護されていないので、私は、データベース・リンクを作成することは好ましいことではないことを

を言及する必要がありますこれを行うと、 データベースリンクを介していくつかのユーザーとDB1に接続することができます...それはあなたのために重要でない場合はそれを使用してJ)。

対処方法2:

  1. ローカルデータベースに一時テーブルを作成します。
  2. 一時テーブルに行を挿入します。
  3. テンポラリ・テーブルのテンポラリ・ローをリモート・データベースに挿入します。
  4. 一時的な行を削除します。 このソリューションは、最初のものよりも遅いことに注意してください。しかし、それはまた、問題を解決し、はるかに安全です。 http://dbtricks.com/?p=263
0

引用this thread

...in the past Oracle used .world as a default domain if domain 
part was not specified in global db name, they changed it (I 
believe in 10g R1, but I'm not sure) 
2

kupaの答えは、あなたがしたくないか、そこに解決策1または2に従うことができないんしかしあれば、同様に偉大な説明と優れたソリューションを提供しています、私はここで解決策2をチェックアウトをお勧めします。

これは、変数を作成し、ローカル関数の値を代入してから、リモートテーブルを参照しているSQL文の変数を使用して、私の仕事をしてくれました。

私の助けとして、これが誰かを助けてくれることを願っています!

関連する問題