【问题标题】:Is it possible to read a CLOB from a remote Oracle database?是否可以从远程 Oracle 数据库中读取 CLOB?
【发布时间】:2011-04-05 09:34:58
【问题描述】:

This answer 关于 SO 的问题说

...您可以从远程数据库中读取 LONG,但无法读取 CLOB

我在互联网上没有找到任何关于此的信息,是真的吗?对此的任何文档或引用都会有所帮助。

【问题讨论】:

    标签: database oracle


    【解决方案1】:

    答案在特定上下文中是正确的,对于通过数据库链接的简单选择语句,你会得到这个错误:

    ORA-22992:无法使用从远程表中选择的 LOB 定位器。

    来自错误手册:

    原因:无法引用远程 LOB 列。
    操作:删除对远程表中 LOB 的引用。

    我也很难找到有关这方面的权威文档...但我们刚刚在我们的数据仓库中遇到了同样的问题。但是,有几种解决方法可用,例如pulling the data over or creating a view

    【讨论】:

      【解决方案2】:

      @Peter Ilfrich:在尝试访问超过 4000 字节的任何 clob 时,这不会引发异常吗?

      这有点值得考虑,但这意味着您可以安全地通过 dblink 拉回小的 clob (

      select dbms_lob.substr@<link>((select <columnName> from dual@<link>), 4000, 1)  
        from <table>@<link>  
       where dbms_lob.getlength@<link>((select <columnName> from dual@<link>)) <= 4000;  
      

      使用此 PL/SQL 包可以通过 dblink 读取 CLOB(或 BLOB):
      https://github.com/HowdPrescott/Lob_Over_DBLink

      【讨论】:

      • 当所有其他方法都失败时,这对我有用。谢谢。
      • 更正:我可以使用上述包查询表,但 CLOB 列为空。
      • 最后——上面的代码确实可以获取前 4,000 个字符。
      • 这也适用于我,并且能够通过子串下一个块提取超过 4000 个:select dbms_lob.substr@&lt;link&gt;(&lt;columnName&gt;, 4000, 1) chunk_1, dbms_lob.substr@&lt;link&gt;(&lt;columnName&gt;, 4000, 4001) chunk_2, dbms_lob.substr@&lt;link&gt;(&lt;columnName&gt;, 4000, 8001) chunk_3, ...&lt;etc as needed&gt;... from &lt;table&gt;@&lt;link&gt;
      【解决方案3】:

      如果两个数据库方案都在同一个 Oracle 实例中,您可以使用以下解决方法:

      select (select &lt;columnName&gt; from dual) &lt;columnName&gt; from &lt;table&gt;@&lt;link&gt;

      这将返回与访问本地 LOB 列相同的结果。

      【讨论】:

      • 出于某种奇怪的原因,它在视图中不起作用,但在我的情况下会导致解决方案。谢谢!
      • 这是什么?这是我的问题的一些填充文本。
      【解决方案4】:

      我昨天也遇到了同样的麻烦。这是我的解决方案:在 romote 表上创建一个 romote 视图,当 CLOB cols 出现时,使用 to_char(),例如 to_char(col2)。然后您可以从视图中选择数据。这可能不是一个好的解决方案,但它确实有效。

      【讨论】:

        【解决方案5】:
        【解决方案6】:

        Oracle 12.2 终于增加了对distributed LOBs 的支持。我们现在可以通过数据库链接读取 CLOB 和 XMLType 等数据类型,而无需任何变通方法。

        【讨论】:

          【解决方案7】:

          当您来自 dblink 的表是 Oracle 大数据外部表(在我的情况下是 Hive 表上的外部表)时,您需要在其上创建一个物化视图并将该物化视图与上述 pl/sql 包一起使用:https://github.com/HowdPrescott/Lob_Over_DBLink

          适用于 clob > 4000。

          仅针对 CLOB 测试!

          【讨论】:

            猜你喜欢
            • 2019-07-25
            • 2017-12-19
            • 2015-03-02
            • 2022-07-21
            • 2017-08-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多