dblink 上的 Oracle sql 类型

Posted

技术标签:

【中文标题】dblink 上的 Oracle sql 类型【英文标题】:Oracle sql types over dblink 【发布时间】:2009-03-13 10:07:39 【问题描述】:

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

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

也许谁知道另一种交互方式?

【问题讨论】:

【参考方案1】:

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

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

Java存储过程的特点:

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

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

我希望这会有所帮助。

【讨论】:

OID 解决方案适用于我的机器。您使用的是哪个 Oracle 版本? 那是几年前的事了(可能是 8 年,也可能是 9i)。我的具体问题是 CLOBS 或 VARCHAR2(4000) 爆炸。 java 路径允许您回避 DBLinks 的限制。 8 和 9 有点老了。它可以在我的带有 OID 的机器上运行,我创建了从 Oracle 11.1 到 Oracle 10.2 的链接。 oo,Java 听起来不错,但是这个解决方案的速度呢?【参考方案2】:

查看此现有讨论

referencing oracle user defined types over dblink

【讨论】:

【参考方案3】:

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

【讨论】:

不,它是一个分布式数据库网络。中心的核心和周围的许多点。 dblink - 这是一种最快且更受欢迎的方式【参考方案4】:

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

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

【讨论】:

以上是关于dblink 上的 Oracle sql 类型的主要内容,如果未能解决你的问题,请参考以下文章

oracle用dblink远程查询的时候在sql窗口经常出现TNS:无法解析指定的连接标识符。有时候又可以。怎么破?

Oracle 使用Dblink

Oracle Sql Query 需要一天的时间才能使用 dblink 返回结果

Oracle SQL:通过 dblink 加入

如何把一个服务器上的Oracle数据导入到另一个Oracle数据库里呢

经典案例:如何优化Oracle使用DBlink的SQL语句