3

私は、Oracleの2つの異なるインスタンスで2つの異なるOracleスキーマで作業しています。これらのスキーマ間でデータを転送するために、いくつかのタイプとタイプコレクションを定義しました。私が遭遇している問題は、型がまったく同じ定義(スキーマで両方のセットを作成するために使用される同じスクリプト)を持っていても、Oracleはそれらを互換性のない異なるオブジェクトと見なしていることです。

着信リモートタイプオブジェクトを同じローカルタイプとしてキャストすることを考えましたが、dblink間でタイプを参照することについてエラーが発生します。

基本的に、私は次のことを行っています。

DECLARE
  MyType  LocalType; -- note, same definition as the RemoteType (same script)
BEGIN
  REMOTE_SCHEMA.PACKAGE.PROCEDURE@DBLINK( MyType );  -- MyType is an OUT param
  LOCAL_SCHEMA.PACKAGE.PROCEDURE( MyType ); -- IN param
END;

REMOTEプロシージャコールはLocalTypeとRemoteTypeを異なるオブジェクトタイプとして扱うため、MyTypeを理解できないため、これは失敗します。

MyTypeの宣言も次のように試しました。

  MyType REMOTE_SCHEMA.RemoteType@DBLINK;

しかし、dblink間でタイプを参照することについて別のエラーが発生します。タイプ間のキャストも機能しません。キャストするには、dblink全体でリモートタイプを参照する必要があるためです。同じ問題、同じエラーです。また、2つのインスタンス間で交差するオブジェクトとしてSYS.ANYDATAを使用しようとしましたが、同様のエラーが発生します。

何か案は?

更新: 同じOIDを使用してDBLINKの両側でオブジェクトタイプを宣言しようとしましたが(を使用して手動で取得SYS_OP_GUID())、Oracleは2つのオブジェクトを異なるものとして「認識」し、「間違った数またはタイプの引数」エラーをスローします。

4

2 に答える 2

6

私は Oracle のドキュメントを読みましたが、それほど難しいものではありません。

両方のデータベースのタイプ定義に OID を追加する必要があります。

GUID を OID として使用できます。

SELECT SYS_OP_GUID() FROM DUAL; 

SYS_OP_GUID()
--------------------------------
AE34B912631948F0B274D778A29F6C8C

ここで、同じOIDを使用して両方のデータベースに UDT を作成します。

create type testlinktype oid 'AE34B912631948F0B274D778A29F6C8C' as object
( v1 varchar2(10) , v2 varchar2(20) );
/

テーブルを作成します。

create table testlink 
( name testlinktype);

insert into testlink values (testlinktype ('RC','AB'));

commit;

これで、他のデータベースの dblink を介してテーブルから選択できます。

select * from testlink@to_ora10;

NAME(V1, V2)
--------------------------
TESTLINKTYPE('RC', 'AB')

最初に dblink を介して選択しようとしたときにエラー ORA-21700 が発生した場合は、再接続してください。

于 2008-12-19T09:13:34.263 に答える
1

根底にある問題は、いわば、Oracleがカスタムタイプを自動的にシリアル化/逆シリアル化する方法を知らないことだと思います。

おそらく最善の策は、XML (またはその他の) 表現をリンク経由で渡すことです。

于 2008-12-18T20:58:25.373 に答える