我在两个不同的 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 视为不同的对象类型。
我也尝试如下 DECLARING MyType:
MyType REMOTE_SCHEMA.RemoteType@DBLINK;
但我得到另一个关于跨 dblinks 引用类型的错误。类型之间的 CAST 也不起作用,因为为了进行转换,我需要跨 dblink 引用远程类型——同样的问题,同样的错误。我也尝试使用 SYS.ANYDATA 作为跨越两个实例的对象,但它得到了类似的错误。
有任何想法吗?
更新:
尝试使用相同的 OID 声明 DBLINK 两侧的对象类型(使用手动检索SYS_OP_GUID()
),但 Oracle 仍然“认为”这两个对象不同,并引发“错误数量或类型的争论”错误。