oracle之通过 DBLINK 引用 Oracle 用户定义的类型
我在两个不同的 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 视为不同的对象类型。
我也尝试如下声明 MyType:
MyType REMOTE_SCHEMA.RemoteType@DBLINK;
但我收到另一个有关跨数据库链接引用类型的错误。类型之间的转换也不起作用,因为为了进行转换,我需要跨 dblink 引用远程类型——同样的问题,同样的错误。我也尝试过使用 SYS.ANYDATA 作为跨越两个实例的对象,但它得到了类似的错误。
有什么想法吗?
更新: 尝试使用相同的 OID 在 DBLINK 的两侧声明对象类型(使用 SYS_OP_GUID() 手动检索)但 Oracle 仍然“认为”这两个对象不同并抛出“错误的数字或类型”争论”错误。
请您参考如下方法:
我看过Oracle文档,不是很难。
您需要将 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,只需重新连接即可。
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。



