我在两个不同的Oracle模式工作的Oracle的两个不同的实例。我定义了几种类型和类型集合这些模式之间传输数据。我遇到的问题是,即使该类型具有完全相同的定义(用于创建的模式两套相同的脚本),Oracle看到他们是不能互换不同的对象。

我考虑铸造传入的远程型对象作为同一本地类型,但我得到一个错误有关跨dblinks引用类型。

基本上,我做以下内容:

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;

这将失败,因为远程过程调用无法理解的MyType因为它把LocalType和RemoteType为不同的对象类型。

我试图宣布的MyType如下以及:

  MyType REMOTE_SCHEMA.RemoteType@DBLINK;

但我得到另一个错误有关跨dblinks引用类型。类型之间铸造无法正常工作或因为为了投,我需要引用整个DBLINK远程类型 - 同样的问题,同样的错误。我已经使用SYS.ANYDATA作为两个实例之间穿过对象还试图但它得到一个类似的错误。

任何想法?

<强>更新 尝试使用相同的OID(手动检索使用SYS_OP_GUID()),但仍然甲骨文“看到”两个对象作为不同和抛出一个“错误的数量或类型的arguements”关于DBLINK两侧声明该对象类型的错误。

有帮助吗?

解决方案

我已阅读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')

如果你得到错误ORA-21700,当您试图通过DBLINK选择在第一时间,就重新连接。

其他提示

我觉得根本的问题是,甲骨文不知道如何来自动序列化/过电线反序列化的自定义类型,可以这么说。

您最好的选择可能是通过一个XML(或其他)表示在该链路。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top