我有两个模式:A 和 B(甲骨文 9)。在 A 处有一个到 B 的 dblink。在 B 有一个包,我从 A 调用它。B 包中的过程可以返回不同的计数结果,因此我认为返回集合是更好的方法。

create type B.tr_rad as object (
  name     varchar2(64)
 ,code     number
 ,vendor   number
 ,val      varchar2(255)
 ,num      number
);

create type B.tt_rad as varray(256) of B.tr_rad;

但从 A 方案中,我无法使用 tt_rad 类型,因为不支持通过 dblink 使用 SQL 类型。DBMS_SQL 不支持游标。创建具有相同 OID 的类型是不可能的。

我认为使用临时表。但首先它不太好(远程函数返回值后,调用方必须从远程表中选择集合)。人们担心临时表的工作速度会减慢。

也许谁知道另一种互动?

有帮助吗?

解决方案

我过去也遇到过类似的问题。然后我得出的结论是,从根本上来说,Oracle 的数据库链接对于除简单 SQL 类型之外的任何内容都是“损坏的”(尤其是 UDT、CLOBS 可能有问题,XMLType 也可能有问题)。如果您能让 OID 解决方案正常运行,那么祝您好运。

我采取的解决方案是使用 Java 存储过程,而不是 DB Link。

Java存储过程的特点:

  1. 可以返回“丰富的类型集”,几乎所有复杂类型(UDT、表/数组/数组)请参见 Oracle 在线文档 了解详情。Oracle 在从 java 编组复杂(或丰富)类型方面比从 DBLink 做得更好。
  2. 存储的 Java 可以获取“默认连接”(与数据库的 SQL 连接在同一会话中运行 - 没有身份验证问题)。
  3. 存储的 Java 调用远程 DB 上的 PL/SQL 过程,并且 java JDBC 层从远程 DB 进行封送。
  4. 存储的Java将结果打包并将结果返回给SQL或PL/SQL层。

这需要一些工作,但如果您懂一点 Java,您应该能够从 Oracle 文档和示例中“剪切并粘贴”解决方案。

我希望这有帮助。

其他提示

另一种相互作用是具有的一个与模式数据库和B代替两个数据库的一个数据库链接。

我的解决方案。在一边 我创建像集合记录一样的临时表。在 A 我有一个 DBMS_SQL 包装器,它通过 dblink 调用过程。此过程将结果集合写入临时表中。成功完成远程过程后,我从远程临时表中选择结果并将其转换为本地集合类型。

限制1。需要永久对象同步。2.不可能在 SQL 查询中使用 A 端过程(调用远程过程)。3.使用的复杂性。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top