CLOB против VARCHAR2 и есть ли другие альтернативы?

Я использую DevArt dotConnect и Entity Developer для моего приложения. Я создал таблицы, используя функцию Entity-First.

Я заметил, что для многих типов столбцов задано значение CLOB. У меня только есть опыт работы с MySQL и сервером Microsoft SQL, поэтому я не уверен в использовании CLOB для приложения. Я сделал некоторое чтение и узнал, что CLOB для большого объема данных.

Вопросы:

  • Используется ли CLOB для большинства полей, таких как пол пользователя (который должен быть varchar (1)) или полное имя, возможно? Шаги для преобразования поля CLOB в VARCHAR2 требуют отбрасывания столбца, а затем его повторного создания и ошибок в DevArt Entity Explorer, поэтому я хотел бы избежать его, если это возможно. Изменить: я только выяснил, что если вы установите максимальную длину для строкового поля, это будет автоматически VARCHAR2.

  • Существуют ли какие-либо эквиваленты для TINYTEXT в Oracle?

Ответ 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>

Вызов этой процедуры может быть автоматизирован или сценарием обычным способом.

Ответ 2

Использование CLOB для чего-то вроде столбца Gender было бы, как минимум, чрезвычайно необычным. Если DDL, созданный этим инструментом, указывает, что данные LOB должны храниться в строке, а не в строке, я бы не ожидал каких-либо ужасных проблем с производительностью. Но вы, вероятно, создадите проблемы для других инструментов, обращающихся к базе данных, которые не очень хорошо обрабатывают LOB.

В Oracle нет эквивалента в Oracle Tinytext в MySQL. CLOB - это CLOB.

Ответ 3

Простое решение - перейти в Model Explorer → Model.Store → Таблицы/Представления, найти нужный столбец и изменить тип этого поля на VARCHAR2.
Затем запустите мастер обновления базы данных из мастера моделей, чтобы сохранить изменения в базе данных.
Не забудьте установить факс MaxLength (однако проблема с ним уже исправлена ​​в предстоящей сборке Beta).