Много лоша идея е да използвате тип данни CLOB за колона, която трябва да бъде VARCHAR2(1). Освен режийните разходи (които всъщност са минимални, тъй като Oracle ще третира вградените CLOB от <4000 знака като 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>
Извикването на тази процедура може да бъде автоматизирано или скриптирано по обичайните начини.