Очень плохая идея использовать тип данных CLOB для столбца, который должен быть VARCHAR2 (1).Помимо накладных расходов (которые на самом деле минимальны, поскольку Oracle будет обрабатывать встроенные CLOB <4000 символов как VARCHAR2), мы всегда должны стремиться использовать наиболее точное представление наших данных в схеме: это просто хорошая практика. </p>
Это действительно похоже на проблему с инструментом 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>
Вызов этой процедурыможет быть автоматизирован или записан обычными способами.