2010-06-04 72 views
12

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

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

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

更新:专有的编程语言允许定义类型为字符串和blob的变量,没有CLOB的选项。我了解给出的答案,但我不能接受DBA。我明白,偏离BLOB或LONG将成为开发者的噩梦,但仍然无法提供帮助。

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

+15

这听起来像是DailyWTF的故事正在我们眼前展开... – 2010-06-04 16:55:33

+1

好吧,如果你告诉你的DBA这就是你要做的事情,那么我相信他们会愿意重新考虑BLOB或长。任何事情要避免:) – 2010-06-04 16:57:19

+1

作为初级开发人员,我有这种情况,并被迫使用一系列nvarchar行映射一个接一个。插入和更新逻辑非常复杂,以至于应用程序层出现比dba头疼更糟糕的维护性头痛。 – dkackman 2010-06-04 17:01:01

回答

1

BLOB是最好的解决方案。其他任何东西都不太方便,并且会造成更大的维修烦恼。

2

你说没有BLOB或LONG ...但CLOB怎么样? 4GB字符数据。

12

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

你也可以看看CLOB类型,因为它会很好地满足你的需求。

1

BFILE是您数据库管理员可行的替代数据类型吗?

1

我不明白。 CLOB是适当的数据库数据类型。如果你奇怪的编程语言将处理8000(或其他)字符的字符串,那么停止将它们写入CLOB就会停止。

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

7

您可以按照Oracle在信息架构中存储其存储过程的方式。定义称为文本列的表格:

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

标识符列是原始表的外键。该行是一个简单的整数(而不是一个序列),以保持文本字段的顺序。这可以保留更大的数据块

是的,这不像blob,clob或LONG那样高效(如果可能的话,我会避免使用LONG字段)。是的,如果你的数据库管理员在数据库中管理CLOB字段时遇到了麻烦,那么这需要更多的工作量,这是选项二。

编辑:

下面MY_TABLE是您目前拥有的VARCHAR列,你正在寻求扩大。我会保留在短文本字段的表格中。

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

然后编写查询拉由MY_TEXT场线数据连接两个表,订货。您的应用程序需要将字符串拆分为2000个字符块并按行顺序插入。

我会在PL/SQL过程中做到这一点。插入和选择。 PL/SQL VARCHAR字符串最多可以有32K个字符。这可能或可能不足以满足您的需求。

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

+0

我想我得到你在说什么。你能解释一下更多,也许有一个例子吗? – user32262 2010-06-05 07:52:40

相关问题