12

我们在 Oracle 11g 中有一个带有 varchar2 列的表。我们使用专有的编程语言,该列被定义为字符串。我们最多可以在此列中存储 2000 个字符(4000 个字节)。现在的要求是该列需要存储超过 2000 个字符(实际上是无限字符)。出于维护原因,DBA 不喜欢 BLOB 或 LONG 数据类型。

我能想到的解决方案是从原始表中删除该列并为该列创建一个单独的表,然后将每个字符存储在一行中,以获得无限的字符。该表将与原始表连接以进行查询。

这个问题有更好的解决方案吗?

更新:专有编程语言允许定义字符串和 blob 类型的变量,没有 CLOB 选项。我理解给出的答复,但我不能接受 DBA。我知道偏离 BLOB 或 LONG 将是开发人员的噩梦,但仍然无法解决。

更新 2:如果我需要的最大值是 8000 个字符,我可以再添加 3 列,这样我将有 4 列,每列 2000 个字符,得到 8000 个字符。因此,当第一列已满时,值将溢出到下一列,依此类推。这种设计会有什么不好的副作用吗?请建议。

4

6 回答 6

12

如果 blob 是您需要的,请说服您的 dba,这就是您所需要的。这些数据类型的存在是有原因的,任何你自己的实现都会比内置类型更糟糕。

此外,您可能想查看CLOB类型,因为它可以很好地满足您的需求。

于 2010-06-04T16:55:46.640 回答
8

您可以遵循 Oracle 在信息模式中存储其存储过程的方式。定义一个名为 text columns 的表:

CREATE TABLE MY_TEXT (
IDENTIFIER INT, 
LINE       INT,
TEXT       VARCHAR2 (4000),
PRIMARY KEY (INDENTIFIER, LINE));

标识符列是原始表的外键。Line 是一个简单的整数(不是序列),用于保持文本字段的顺序。这允许保留更大的数据块

是的,这不如 blob、clob 或 LONG 高效(如果可能,我会避免使用 LONG 字段)。是的,这需要更多的维护,如果您的 DBA 坚决反对管理数据库中的 CLOB 字段,这是选项二。

编辑:

下面的 My_Table 是您当前拥有要扩展的 VARCHAR 列的位置。对于短文本字段,我会将其保留在表格中。

CREATE TABLE MY_TABLE (
INDENTIFER INT,
OTHER_FIELD VARCHAR2(10),
REQUIRED_TEXT VARCHAR(4000),
PRIMERY KEY (IDENTFIER));

然后编写查询以拉取数据连接两个表,在 MY_TEXT 字段中按 LINE 排序。您的应用程序需要将字符串拆分为 2000 个字符块并按行顺序插入它们。

我会在 PL/SQL 过程中执行此操作。插入和选择。PL/SQL VARCHAR 字符串最多可包含 32K 个字符。这可能足以满足您的需求,也可能不够大。

但就像其他回答这个问题的人一样,我强烈建议向 DBA 提出一个案例,让该列成为 CLOB。从程序的角度来看,这将是一个 BLOB,因此易于管理。

于 2010-06-05T01:06:25.333 回答
2

你说没有 BLOB 或 LONG……但是 CLOB 呢?4GB 字符数据。

于 2010-06-04T16:52:34.263 回答
1

BLOB 是最好的解决方案。其他任何事情都会不那么方便,并且会带来更大的维护烦恼。

于 2010-06-04T16:52:23.373 回答
1

BFILE 对您的 DBA 来说是一种可行的替代数据类型吗?

于 2010-06-04T18:24:42.930 回答
1

我不明白。CLOB 是适当的数据库数据类型。如果您奇怪的编程语言将处理 8000 个(或其他)字符的字符串,那么是什么阻止了它将这些字符串写入 CLOB。

更具体地说,当您尝试将 8000 个字符的字符串插入定义为 CLOB 的列时,您会得到什么错误(来自 Oracle 或您的编程语言)。

于 2010-06-05T00:50:46.443 回答