Oracle
 sql >> база данни >  >> RDS >> Oracle

CLOB срещу VARCHAR2 и има ли други алтернативи?

Много лоша идея е да използвате тип данни 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>

Извикването на тази процедура може да бъде автоматизирано или скриптирано по обичайните начини.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Производителност на Oracle CLOB

  2. Oracle JDBC:Как да разбера кой ред хвърля ограничение за уникален ключ?

  3. Опресняване / Актуализиране на екран на формуляр в Oracle D2k Forms 6i

  4. Как да използвате команди като DROP TABLE и т.н. в съхранена процедура

  5. Как да получите името на деня от седмицата от дата?