1

我有两个模式:A 和 B (Oracle 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 的类型是不可能的。

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

也许谁知道替代交互?

4

4 回答 4

1

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

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

Java存储过程的特点:

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

这有点工作,但如果你有一点 java 知识,你应该能够从 Oracle 文档和示例中“剪切和粘贴”一个解决方案。

我希望这有帮助。

于 2009-03-13T21:40:13.193 回答
0

看到这个现有的讨论

通过 dblink 引用 oracle 用户定义的类型

于 2009-03-13T11:36:21.520 回答
0

另一种交互方式是拥有一个具有模式 A 和 B 的数据库,而不是两个具有数据库链接的数据库。

于 2009-03-13T13:35:48.740 回答
0

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

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

于 2009-03-17T09:03:25.873 回答