Bardzo złym pomysłem jest użycie typu danych CLOB dla kolumny, która powinna być VARCHAR2(1). Oprócz kosztów ogólnych (które są w rzeczywistości minimalne, ponieważ Oracle będzie traktować wbudowane obiekty CLOB o długości <4000 znaków jako VARCHAR2), powinniśmy zawsze dążyć do jak najdokładniejszej reprezentacji naszych danych w schemacie:to po prostu dobra praktyka.
To naprawdę wydaje się być problemem z narzędziem DevArt lub być może twoim zrozumieniem, jak z niego korzystać (bez obrazy). Powinien istnieć jakiś sposób na określenie typu danych atrybutu jednostki i/lub sposób odwzorowania tych specyfikacji na fizyczne typy danych Oracle. Przepraszam, jeśli wydaje się to trochę niejasne, nie znam produktu.
Oto podstawowy problem:
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>
Możemy to naprawić, używając DDL do zmiany struktury tabeli. Ponieważ schemat ma wiele takich kolumn warto zautomatyzować proces. Ta funkcja usuwa istniejącą kolumnę i odtwarza ją jako VARCHAR2. Oferuje opcję migracji danych z kolumny CLOB do kolumny VARCHAR2; prawdopodobnie nie potrzebujesz tego, ale jest tam dla kompletności. (To nie jest kod jakości produkcyjnej - wymaga obsługi błędów, zarządzania ograniczeniami NOT NULL itp.)
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;
/
Zmieńmy więc tę kolumnę...
SQL> exec clob2vc ('T69', 'COL1', 1)
PL/SQL procedure successfully completed.
SQL> desc t69
Name Null? Type
----------------------------------------- -------- ---------------
COL1 VARCHAR2(1)
SQL>
Wywołanie tej procedury można zautomatyzować lub oskryptować w zwykły sposób.