我们在Oracle 11g中有一个带有varchar2列的表。我们使用专有的编程语言,其中此列定义为字符串。最大值我们可以在此列中存储2000个字符(4000个字节)。现在要求是列需要存储超过2000个字符(实际上是无限字符)。出于维护原因,DBA不喜欢BLOB或LONG数据类型。
我能想到的解决方案是从原始表中删除此列,并为此列创建一个单独的表,然后将每个字符存储在一行中,以获得无限制的字符。此tble将与原始表连接以进行查询。
这个问题有更好的解决方案吗?
更新:专有编程语言允许定义string和blob类型的变量,没有CLOB选项。我理解给出的回复,但我无法接受DBA。我明白偏离BLOB或LONG将是开发者的噩梦,但仍然无法帮助它。
更新2:如果我需要的最大值是8000个字符,我可以再添加3个列,这样我就会有4个列,每个列有2000个字符,以获得8000个字符。因此,当第一列填满时,值将溢出到下一列,依此类推。这个设计会有什么不好的副作用吗?请建议。
答案 0 :(得分:12)
如果你需要一个blob说服你的dba,那就是你需要的。那些数据类型是有原因的,任何 roll你自己的实现将比内置类型更糟糕。
此外,您可能希望查看CLOB类型,因为它可以很好地满足您的需求。
答案 1 :(得分:7)
您可以按照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,因此易于管理。
答案 2 :(得分:2)
你说没有BLOB或LONG ......但是CLOB怎么样? 4GB字符数据。
答案 3 :(得分:1)
BLOB是最好的解决方案。其他任何东西都不太方便,维护更大的烦恼。
答案 4 :(得分:1)
BFILE是否是DBA可行的替代数据类型?
答案 5 :(得分:1)
我不明白。 CLOB是适当的数据库数据类型。如果您奇怪的编程语言将处理8000(或其他)字符的字符串,那么它会阻止它写入CLOB。
更具体地说,当您尝试将8000字符串插入定义为CLOB的列时,您会得到什么错误(来自Oracle或您的编程语言)。