引用Oracle用户定义类型在DBLINK?
-
22-08-2019 - |
题
我在两个不同的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;
但我得到另一个错误有关跨dblinks引用类型。类型之间铸造无法正常工作或因为为了投,我需要引用整个DBLINK远程类型 - 同样的问题,同样的错误。我已经使用SYS.ANYDATA作为两个实例之间穿过对象还试图但它得到一个类似的错误。
任何想法?
<强>更新强>
尝试使用相同的OID(手动检索使用SYS_OP_GUID()
),但仍然甲骨文“看到”两个对象作为不同和抛出一个“错误的数量或类型的arguements”关于DBLINK两侧声明该对象类型的错误。
解决方案
我已阅读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,当您试图通过DBLINK选择在第一时间,就重新连接。
其他提示
我觉得根本的问题是,甲骨文不知道如何来自动序列化/过电线反序列化的自定义类型,可以这么说。
您最好的选择可能是通过一个XML(或其他)表示在该链路。
不隶属于 StackOverflow