CLOB vs. VARCHAR2 и есть ли другие альтернативы? - PullRequest
11 голосов
/ 20 апреля 2011

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

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

Вопросы:

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

  2. Есть ли какие-либо эквиваленты для TINYTEXT в Oracle?

Ответы [ 3 ]

18 голосов
/ 20 апреля 2011

Очень плохая идея использовать тип данных 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>

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

7 голосов
/ 20 апреля 2011

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

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

4 голосов
/ 21 апреля 2011

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

...