字符溢出Oracle 11g中的多个列?

时间:2010-06-07 21:14:04

标签: oracle oracle11g varchar2

这与问题有关:How to store unlimited characters in Oracle 11g?

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

3 个答案:

答案 0 :(得分:11)

为什么不使用CLOB列呢?我读了你的其他链接,我不明白为什么你的DBA不喜欢这些类型的列。我的意思是,CLOB是Oracle的一个重要特性,仅用于此目的。在购买Oracle时,您的公司为该功能付出了很多钱,那么为什么不利用Oracle来获得最全面的功能,而不是试图通过黑客来做一些数据库并不是真正想做的事情呢?

也许不是花时间设计黑客来克服DBA所造成的限制,您应该花一些时间来教育您的DBA,了解为什么CLOB是解决问题的正确功能。

当DB具有我需要设计好的功能时,我永远不会对糟糕的设计感到满意。如果DBA是问题所在,那么他们需要改变自己的观点,或者我认为你应该去高级管理层。

答案 1 :(得分:3)

我同意 dcp 您应该使用CLOB。但如果反对所有意义,你只能使用VARCHAR2列“滚动你自己的”无限文本,那么我不会通过向表中添加越来越多的VARCHAR2列来实现这一点:

create table mytable
  ( id integer primary key
  , text varchar2(2000)
  , more_text varchar2(2000)
  , and_still_more_text varchar2(2000)
  );

相反,我会将文本移动到一个单独的子表中,如下所示:

create table mytable
  ( id integer primary key
  );
create table mytable_text
  ( id references mytable(id)
  , seqno integer
  , text varchar2(2000)
  , primary key (id, seqno)
  );

然后,您可以使用mytable_text中的许多行为每个mytable行插入尽可能多的文本。

答案 2 :(得分:2)

添加到DCP和Tony的优秀答案:

你问你提出的方法是否会产生任何不良副作用。以下是一些需要考虑的事项:

  1. 假设您要搜索特定字符串的文本数据。您的方法需要在包含您的文本的每个列上重复搜索 - 导致一个错综复杂且效率低下的WHERE子句。
  2. 每次要扩展文本字段时,都必须添加另一列,这意味着您必须修改编码的每个位置(1)。
  3. 在你诅咒你的名字之后,每个必须维持这种结构的人; - )