如何在Oracle 11g中存储无限制的字符?

use*_*262 12 oracle types blob clob oracle11g

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

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

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

更新:专有编程语言允许定义string和blob类型的变量,没有CLOB选项.我理解给出的回复,但我无法接受DBA.我明白偏离BLOB或LONG将是开发人员的噩梦,但仍然无法帮助它.

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

dka*_*man 12

如果你需要一个blob说服你的dba,那就是你需要的.那些数据类型是有原因的,任何滚动你自己的实现将比内置类型更糟糕.

您也可以查看CLOB类型,因为它可以很好地满足您的需求.


Tho*_*Low 7

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

CREATE TABLE MY_TEXT (
IDENTIFIER INT, 
LINE       INT,
TEXT       VARCHAR2 (4000),
PRIMARY KEY (INDENTIFIER, LINE));
Run Code Online (Sandbox Code Playgroud)

标识符列是原始表的外键.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));
Run Code Online (Sandbox Code Playgroud)

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

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

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


Ami*_*shk 1

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