Det är en mycket dålig idé att använda en CLOB-datatyp för en kolumn som borde vara VARCHAR2(1). Förutom omkostnaderna (som faktiskt är minimala, eftersom Oracle kommer att behandla inline-CLOBs på <4000 tecken som VARCHAR2) bör vi alltid sträva efter att använda den mest exakta representationen av vår data i schemat:det är bara bra praxis.
Det här verkar verkligen vara ett problem med DevArt-verktyget, eller kanske din förståelse för hur man använder det (ingen anstöt). Det borde finnas något sätt för dig att specificera datatypen för en entitets attribut och/eller ett sätt att mappa dessa specifikationer till Oracles fysiska datatyper. Jag ber om ursäkt om detta verkar lite vagt, jag är inte bekant med produkten.
Så det här är det grundläggande problemet:
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>
Vi kan fixa det genom att använda DDL för att ändra tabellstrukturen. Eftersom schemat har många sådana kolumner är det värt att automatisera processen. Denna funktion tar bort den befintliga kolumnen och återskapar den som en VARCHAR2. Den erbjuder möjligheten att migrera data i kolumnen CLOB till kolumnen VARCHAR2; du behöver förmodligen inte detta, men det finns där för fullständighetens skull. (Detta är inte produktionskvalitetskod - den behöver felhantering, hantera NOT NULL-begränsningar, etc.)
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;
/
Så låt oss ändra den kolumnen...
SQL> exec clob2vc ('T69', 'COL1', 1)
PL/SQL procedure successfully completed.
SQL> desc t69
Name Null? Type
----------------------------------------- -------- ---------------
COL1 VARCHAR2(1)
SQL>
Att anropa denna procedur kan automatiseras eller skriptas på vanliga sätt.