3

我在两个不同的 Oracle 实例上使用两个不同的 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 过程调用无法理解 MyType,因为它将 LocalType 和 RemoteType 视为不同的对象类型。

我也尝试如下 DECLARING MyType:

  MyType REMOTE_SCHEMA.RemoteType@DBLINK;

但我得到另一个关于跨 dblinks 引用类型的错误。类型之间的 CAST 也不起作用,因为为了进行转换,我需要跨 dblink 引用远程类型——同样的问题,同样的错误。我也尝试使用 SYS.ANYDATA 作为跨越两个实例的对象,但它得到了类似的错误。

有任何想法吗?

更新: 尝试使用相同的 OID 声明 DBLINK 两侧的对象类型(使用手动检索SYS_OP_GUID()),但 Oracle 仍然“认为”这两个对象不同,并引发“错误数量或类型的争论”错误。

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 回答