通过DBLINK引用Oracle用户定义的类型?
我在两个不同的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; 这失败是因为REMOTE过程调用无法理解MyType,因为它将LocalType和RemoteType视为不同的对象类型. 我也尝试了DECLARING MyType,如下所示: MyType REMOTE_SCHEMA.RemoteType@DBLINK; 但我得到另一个关于跨dblinks引用类型的错误.类型之间的CASTing也不起作用,因为为了进行强制转换,我需要跨dblink引用远程类型 – 同样的问题,同样的错误.我也尝试使用SYS.ANYDATA作为在两个实例之间穿过的对象,但它得到了类似的错误. 有任何想法吗? 更新: 您需要在两个数据库中的类型定义中添加OID. 您可以将GUID用作OID. SELECT SYS_OP_GUID() FROM DUAL; SYS_OP_GUID() -------------------------------- AE34B912631948F0B274D778A29F6C8C 现在使用SAME 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,只需重新连接即可. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |