sql >> Databáze >  >> RDS >> Oracle

CLOB vs. VARCHAR2 a existují další alternativy?

Je velmi špatný nápad použít datový typ CLOB pro sloupec, který by měl být VARCHAR2(1). Kromě režijních nákladů (které jsou ve skutečnosti minimální, protože Oracle bude s vloženými CLOBy o délce <4000 znaků zacházet jako s VARCHAR2) bychom se měli vždy snažit používat co nejpřesnější reprezentaci našich dat ve schématu:je to jen dobrá praxe.

To opravdu vypadá jako problém s nástrojem DevArt, nebo možná vaše chápání toho, jak jej používat (bez urážky). Měl by existovat nějaký způsob, jak specifikovat datový typ atributu entity a/nebo způsob mapování těchto specifikací na fyzické datové typy Oracle. Omlouvám se, pokud to vypadá trochu nejasně, produkt neznám.

Takže toto je základní problém:

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>

Můžeme to opravit pomocí DDL ke změně struktury tabulky. Protože schéma má mnoho takových sloupců, vyplatí se proces automatizovat. Tato funkce zruší existující sloupec a znovu jej vytvoří jako VARCHAR2. Nabízí možnost migrovat data ve sloupci CLOB do sloupce VARCHAR2; pravděpodobně to nepotřebujete, ale je to tam pro úplnost. (Toto není kód produkční kvality – potřebuje zpracování chyb, správu NOT NULL omezení atd.)

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;
/

Změňme tedy tento sloupec...

SQL> exec clob2vc ('T69', 'COL1', 1)

PL/SQL procedure successfully completed.

SQL> desc t69
 Name                                      Null?    Type
 ----------------------------------------- -------- ---------------
 COL1                                               VARCHAR2(1)

SQL>

Volání této procedury lze zautomatizovat nebo naskriptovat obvyklými způsoby.



  1. Obrázek z databáze MySQL se netiskne

  2. SUM() nefunguje v MySQL:SUM() s DISTINCT

  3. Jak pokračovat ve smyčce po výjimce vyvolané v SQL

  4. SQLAlchemy a joins, nemáme žádné cizí klíče