【问题标题】:Splitting a CLOB column using Derived (Virtual) columns使用派生(虚拟)列拆分 CLOB 列
【发布时间】:2019-02-08 20:51:53
【问题描述】:

使用派生列自动拆分大列

我们的表有一个 CLOB 列。问题是每当 UI 或任何应用程序尝试提取此列时,必须首先将其拆分为更小的块(因为 Oracle 将 VARCHAR2 限制为 4000)。

使用Virtual (Derived) 列自动将CLOB 列拆分为4k 段是否有意义(如下所示)。

因此 - 如果任何应用程序只需要前 4k 个字符,它都可以简单地查询 seg_1。或 seg_1 + seg_2 等等。 (假设我们的数据只有 8k)

create table code_text2 
( 
      text_clob    clob,
      seg_1        varchar2 (4000 byte) generated always as (substrb
                               (text_clob, 1, 4000)) virtual,
      seg_2        varchar2 (4000 byte) generated always as (substrb (text_clob, 4001, 4000)) virtual 
); 

【问题讨论】:

  • 首先在 PL SQL VARCHAR2 中最大大小是 32767 字节,然后 PL SQL 允许通过其自身(CLOB 类型)来处理 clob。最后在 jdbc 中你有 java.sql.Clob。为什么要拆分 text_clob?
  • 这让我觉得这可能是问题的错误解决方案。我能想到的每个流行客户端(Java、.Net、Python 等)都有可以处理来自数据库的 clob 的驱动程序。您不必将其拼凑成 varchars
  • 您使用的是什么版本的 Oracle?如果您使用的是 Oracle 12.1 或更高版本,您可以将 max_string_size 设置为 EXTENDED 以获取 32k 字符串而不是 4000 字节字符串。 docs.oracle.com/database/121/REFRN/…

标签: oracle plsql


【解决方案1】:

我同意 cmets 的观点,即这不是正确的方法。您应该弄清楚您的 UI 或驱动程序中的哪些内容或任何阻止您正确检索CLOB 的内容。

如果客户真的只关心CLOB 中的前 4000 个字符(尽管我想不出客户为什么想要这样做),他们可以这样做:

select dbms_lob.substr( mylob, 4000, 1 ) ...

我认为您不应该将SUBSTRBCLOBs 一起使用,因为它们是字符数据。如果您的第 4000 个字符是 2 字节宽,会发生什么?它会被损坏。

【讨论】:

  • 数据库为 12.1,PL/SQL VARCHAR2 的长度为 32,767。但是我们的客户端应用程序有不同的需求。 - 有些人只想要前 4000 个字节 - 有些人想要整个 32767 - 其他人在检索 CLOB 时没有问题如上所述 - 尽管每个客户端都可以执行类似于 (dbms_lob.substr(mylob, 4000, 1) 的操作,但我想提供一个包装器让每个人的生活更轻松。也许可以提供具有不同参数的重载函数,并使整个底层实现透明。对此有什么想法吗?
  • 只是我的意见,我认为这是个坏主意。你已经有了那个界面,它是substrdbms_lob。让客户端应用程序决定它想要什么并通过 SQL 查询请求。
猜你喜欢
  • 2019-11-04
  • 2013-08-03
  • 2012-01-05
  • 1970-01-01
  • 2011-01-15
  • 1970-01-01
  • 2011-04-16
  • 1970-01-01
相关资源
最近更新 更多