我正在为我的应用程序使用DevArt的dotConnect和Entity Developer。我已经使用Entity-First功能创建了表。
我注意到许多列类型都设置为CLOB。我只具有MySQL和Microsoft SQL Server的经验,所以不确定将CLOB用于该应用程序。我做了一些阅读,发现CLOB是用于处理大量数据的。
问题是:
最佳答案
将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>
可以自动执行该过程,也可以采用通常的方式编写脚本。