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 Sql Query 需要一天的时间才能使用 dblink 返回结果