是否通过DBLINK引用Oracle用户定义的类型?

是否通过DBLINK引用Oracle用户定义的类型?,oracle,types,collections,dblink,Oracle,Types,Collections,Dblink,我在两个不同的Oracle实例上使用两种不同的Oracle模式。我已经定义了几个类型和类型集合来在这些模式之间传输数据。我遇到的问题是,即使类型具有完全相同的定义(用于在模式中创建两个集合的脚本相同),Oracle仍将它们视为不同的对象,不能互换 我曾考虑将传入的远程类型对象强制转换为相同的本地类型,但在跨dblinks引用类型时出错 基本上,我正在做以下工作: DECLARE MyType LocalType; -- note, same definition as the Remote

我在两个不同的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;
但是我在跨数据库链接引用类型时遇到了另一个错误。类型之间的强制转换也不起作用,因为为了强制转换,我需要跨dblink引用远程类型-同样的问题,同样的错误。我还尝试使用SYS.ANYDATA作为两个实例之间的交叉对象,但它得到了类似的错误

有什么想法吗

更新:
尝试使用相同的OID(使用
SYS\u OP\u GUID()
手动检索)在DBLINK的两侧声明对象类型,但Oracle仍然“认为”这两个对象不同,并抛出“错误数量或类型的参数”错误。

我认为根本的问题是Oracle不知道如何通过连接自动序列化/反序列化自定义类型


您最好的选择可能是通过链接传递XML(或其他)表示。

我已经阅读了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,只需重新连接即可

是的,甲骨文显然不太喜欢我(也就是说,如果我是针对个人的话)。也许你没有完蛋。TheSoftwareJedi在声明你完蛋之前是否研究过oracle文档?:)这并不是因为“序列化”。这是因为自定义类型被赋予了一个对象标识符,如果两个不同类型的OID不同,则它们被视为不同的类型,即使它们具有相同的名称。请参阅tuinstoel的答案。我曾尝试通过使用相同的OID定义这两种类型来实现tuinstoel的答案,但没有成功。Oracle仍然认为这两种类型是不同的。使用OUT变量(如我的示例所示)是行不通的。我得到了“调用中的参数数量或类型错误”只是为了澄清一下,我不能使用上面提供的对象表示例,我需要这一点来使用对象作为dblink过程调用的out参数。您不能使用用户对象作为数据库链接上的out参数。但是,您可以编写一个过程,将用户对象与表中的唯一编号一起插入,并返回唯一编号。之后,您可以借助唯一编号从此表中选择对象。