dblink上的Oracle sql类型

时间:2009-03-13 10:07:39

标签: oracle collections user-defined-types dblink

我有两个模式: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 个答案:

答案 0 :(得分:1)

过去我遇到过类似的问题。然后我得出结论,基本上Oracle的数据库链接除了简单的SQL类型(特别是UDT,CLOBS可能有问题,XMLType也可能)之外的任何东西都“被破坏”了。如果你可以使用OID解决方案,那么祝你好运。

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

Java存储过程的特征:

  1. 可以返回“丰富的类型集”,几乎所有复杂类型(UDT,表/数组/ varrays)都可以参阅 Oracle online documentation了解详细信息。 Oracle在编写复杂(或丰富)类型的java方面做得比在DBLink上好得多。
  2. 存储的Java可以获取“默认连接”(在与数据库的SQL连接相同的会话中运行 - 没有身份验证问题)。
  3. 存储的Java在远程数据库上调用PL / SQL proc,而java JDBC层从远程数据库执行编组。
  4. 存储的Java打包结果并将结果返回给SQL或PL / SQL层。
  5. 这有点工作,但是如果你有一点java,你应该能够从Oracle文档和样本中“剪切并粘贴”一个解决方案。

    我希望这会有所帮助。

答案 1 :(得分:0)

答案 2 :(得分:0)

另一种交互是将一个数据库与模式A和B而不是两个带有数据库链接的数据库。

答案 3 :(得分:0)

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

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