【问题标题】:Best way to handle LOBs in Oracle distributed databases在 Oracle 分布式数据库中处理 LOB 的最佳方式
【发布时间】:2010-09-07 11:23:05
【问题描述】:

如果您创建 Oracle dblink,则无法直接访问目标表中的 LOB 列。

例如,您使用以下命令创建 dblink:

create database link TEST_LINK 
  connect to TARGETUSER IDENTIFIED BY password using 'DATABASESID';

在此之后,您可以执行以下操作:

select column_a, column_b 
from data_user.sample_table@TEST_LINK

除非列是 LOB,否则会出现错误:

ORA-22992: cannot use LOB locators selected from remote tables

这是a documented restriction

同一页面建议您将值提取到本地表中,但这...有点乱:

CREATE TABLE tmp_hello 
AS SELECT column_a 
from data_user.sample_table@TEST_LINK

还有其他想法吗?

【问题讨论】:

    标签: sql oracle distributed-transactions dblink


    【解决方案1】:

    使用如下查询的最佳解决方案,其中 column_b 是 BLOB:

    SELECT (select column_b from sample_table@TEST_LINK) AS column_b FROM DUAL
    

    【讨论】:

    • @user2015502 你在 Hibernate 公式中试过这个吗?它总是以未找到表的方式响应,并且我的查询在开发人员中工作
    • 感谢您的查询,但它对我不起作用。我得到的是一个大小为 0 的 BLOB。此方法还需要内部选择来过滤:single-row subquery returns more than one row
    • 仅适用于一列选择。不错的解决方法,尽管
    【解决方案2】:

    是的,它很乱,但我想不出办法避免它。
    您可以通过将临时表创建放在存储过程中(并使用“立即执行”来创建它们的表)来隐藏客户端的一些混乱
    您需要注意的一件事是遗留的临时表(如果在会话中途出现故障,在您有时间清理之前) - 您可以安排一个 oracle 作业定期运行并删除任何剩余的表.

    【讨论】:

      【解决方案3】:

      对于查询数据,user2015502的解决方案是最聪明的。如果您想插入或更新 LOB 的 AT 远程数据库(插入到 xxx@yyy ...),您可以轻松地为此使用动态 SQL。见my solution here:

      【讨论】:

        【解决方案4】:

        您可以使用物化视图来处理所有“缓存”管理。它并不完美,但在大多数情况下都有效:)

        【讨论】:

          【解决方案5】:

          你有一个特定的场景吗? 例如,如果 LOB 保存文件,而您在公司 Intranet 上,也许您可​​以编写一个存储过程将文件提取到网络上的已知目录并从那里访问它们。

          【讨论】:

            【解决方案6】:

            在这种特定情况下,两个系统可以通信的唯一方法是使用 dblink。

            另外,表解决方案也没有那么糟糕,只是不得不在我这边的 dblink 上“缓存”数据,这很麻烦。

            【讨论】:

              猜你喜欢
              • 2011-01-05
              • 1970-01-01
              • 2012-04-04
              • 2023-03-21
              • 2011-05-02
              • 1970-01-01
              • 1970-01-01
              • 2018-01-05
              • 2012-12-02
              相关资源
              最近更新 更多