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

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

问题是:

  • 是否对大多数字段(例如用户的性别(应为varchar(1))或全名)使用CLOB可行?将CLOB字段转换为VARCHAR2的步骤需要删除该列,然后重新创建它,并且在DevArt的Entity Explorer中存在错误,因此,如果可能的话,我希望避免使用。 编辑:我刚刚发现,如果您为字符串字段设置最大长度,它将自动为VARCHAR2。
  • Oracle中是否有TINYTEXT的等效项?
  • 最佳答案

    将CLOB数据类型用于应为VARCHAR2(1)的列是一个非常糟糕的主意。除了开销(实际上是极小的开销,因为Oracle将
    这确实似乎是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>
    

    可以自动执行该过程,也可以采用通常的方式编写脚本。

    10-08 07:34
    查看更多