CLOB与VARCHAR2还有其他选择吗?

时间:2011-04-20 13:42:10

标签: oracle oracle11g devart dotconnect

我正在为我的应用程序使用DevArt的dotConnect和Entity Developer。我使用Entity-First功能创建了表格。

我注意到许多列类型都设置为CLOB。我只有MySQL和Microsoft SQL服务器的经验,所以我不确定是否将CLOB用于该应用程序。我做了一些阅读,发现CLOB用于大量数据。

问题是:

  1. 在大多数字段中使用CLOB,例如用户的性别(应该是varchar(1))还是全名,可行吗?将CLOB字段转换为VARCHAR2的步骤需要删除列然后重新创建它,并且在DevArt的实体资源管理器中有问题,所以我想尽可能避免使用它。 修改:我刚刚发现,如果您为字符串字段设置了最大长度,它将自动成为VARCHAR2。

  2. Oracle中是否有TINYTEXT的等价物?

3 个答案:

答案 0 :(得分:18)

对于应该是VARCHAR2(1)的列使用CLOB数据类型是一个非常糟糕的主意。除了开销(实际上是最小的,因为Oracle将处理<4000字符的内联CLOB作为VARCHAR2)之外,我们应该始终努力在模式中使用最准确的数据表示:这只是一种很好的做法。

这似乎是DevArt工具的问题,或者您对如何使用它的理解(没有冒犯)。应该有一些方法可以指定实体属性的数据类型和/或将这些规范映射到Oracle的物理数据类型的方法。如果这看起来有点模糊,我很抱歉,我不熟悉该产品。


所以,这是基本问题:

SQL> desc t69
 Name                                      Null?    Type
 ----------------------------------------- -------- --------
 COL1                                               CLOB

SQL>
SQL> alter table t69 modify col1 varchar2(1)
  2  /
alter table t69 modify col1 varchar2(1)
                       *
ERROR at line 1:
ORA-22859: invalid modification of columns


SQL>

我们可以通过使用DDL来改变表结构来修复它。因为模式有许多这样的列,所以值得自动化该过程。此函数删除现有列并将其重新创建为VARCHAR2。它提供了将CLOB列中的数据迁移到VARCHAR2列的选项;你可能不需要这个,但它是完整的。 (这不是生产质量代码 - 它需要错误处理,管理NOT NULL约束等)

create or replace procedure clob2vc
  ( ptab in user_tables.table_name%type 
    , pcol in user_tab_columns.column_name%type
    , pcol_size in number
    , migrate_data in boolean := true )
is
begin
    if migrate_data
    then
        execute immediate 'alter table '||ptab
                    ||' add tmp_col varchar2('|| pcol_size|| ')';
        execute immediate             
                    'update '||ptab
                    ||' set tmp_col = substr('||pcol||',1,'||pcol_size||')';
    end if;
    execute immediate 'alter table '||ptab
                ||' drop column '|| pcol;

    if migrate_data
    then
        execute immediate 'alter table '||ptab
                    ||' rename column tmp_col to '|| pcol;
    else
        execute immediate 'alter table '||ptab
                    ||' add '||pcol||' varchar2('|| pcol_size|| ')';
    end if;
end;
/

所以,让我们改变那一栏......

SQL> exec clob2vc ('T69', 'COL1', 1)

PL/SQL procedure successfully completed.

SQL> desc t69
 Name                                      Null?    Type
 ----------------------------------------- -------- ---------------
 COL1                                               VARCHAR2(1)

SQL>

调用此过程可以通过常规方式自动执行或编写脚本。

答案 1 :(得分:7)

将CLOB用于类似Gender列的内容,至少会非常不寻常。如果此工具生成的DDL指定LOB数据应该内联存储而不是脱节,我不希望出现任何可怕的性能问题。但是,您可能会为访问数据库的其他工具创建问题,这些工具不能很好地处理LOB。

Oracle中没有与Tinytext相同的内容。 CLOB是CLOB。

答案 2 :(得分:4)

更简单的解决方案是转到Model Explorer - &gt; Model.Store - &gt;表/视图,找到必要的列并将此字段的类型更改为VARCHAR2 然后从模型向导运行“更新数据库”以将更改保留到数据库中 不要忘记设置MaxLength方面(但是,在即将推出的Beta版本中已经修复了它的问题。)