oracle之通过 DBLINK 引用 Oracle 用户定义的类型

oomusou 阅读:102 2025-06-02 22:19:02 评论:0

我在两个不同的 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,只需重新连接即可。


标签:oracle
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号