Ответ 1
Очень плохая идея использовать тип данных 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>
Вызов этой процедуры может быть автоматизирован или сценарием обычным способом.