Je velmi špatný nápad použít datový typ CLOB pro sloupec, který by měl být VARCHAR2(1). Kromě režijních nákladů (které jsou ve skutečnosti minimální, protože Oracle bude s vloženými CLOBy o délce <4000 znaků zacházet jako s VARCHAR2) bychom se měli vždy snažit používat co nejpřesnější reprezentaci našich dat ve schématu:je to jen dobrá praxe.
To opravdu vypadá jako problém s nástrojem DevArt, nebo možná vaše chápání toho, jak jej používat (bez urážky). Měl by existovat nějaký způsob, jak specifikovat datový typ atributu entity a/nebo způsob mapování těchto specifikací na fyzické datové typy Oracle. Omlouvám se, pokud to vypadá trochu nejasně, produkt neznám.
Takže toto je základní problém:
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>
Můžeme to opravit pomocí DDL ke změně struktury tabulky. Protože schéma má mnoho takových sloupců, vyplatí se proces automatizovat. Tato funkce zruší existující sloupec a znovu jej vytvoří jako VARCHAR2. Nabízí možnost migrovat data ve sloupci CLOB do sloupce VARCHAR2; pravděpodobně to nepotřebujete, ale je to tam pro úplnost. (Toto není kód produkční kvality – potřebuje zpracování chyb, správu NOT NULL omezení atd.)
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;
/
Změňme tedy tento sloupec...
SQL> exec clob2vc ('T69', 'COL1', 1)
PL/SQL procedure successfully completed.
SQL> desc t69
Name Null? Type
----------------------------------------- -------- ---------------
COL1 VARCHAR2(1)
SQL>
Volání této procedury lze zautomatizovat nebo naskriptovat obvyklými způsoby.