通过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(使用SYS_OP_GUID()手动检索)声明DBLINK两侧的对象类型,但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,只需重新连接即可.

相关文章

数据库版本:11.2.0.4 RAC(1)问题现象从EM里面可以看到,在23号早上8:45~8:55时,数据库等待会话暴增...
(一)问题背景最近在对一个大约200万行数据的表查看执行计划时,发现存在异常,理论上应该返回100多万...
(一)删除备份--DELETE命令用于删除RMAN备份记录及相应的物理文件。当使用RMAN执行备份操作时,会在RM...
(1)DRA介绍 数据恢复顾问(Data Recovery Advise)是一个诊断和修复数据库的工具,DRA能够修复数据文...
RMAN(Recovery Manager)是Oracle恢复管理器的简称,是集数据库备份(backup)、修复(restore)和恢复...
(1)备份对象 可以使用RMAN进行的备份对象如下: --整个数据库:备份所有的数据文件和控制文件; --数...