sql >> Databasteknik >  >> RDS >> Oracle

CLOB vs. VARCHAR2 och finns det andra alternativ?

Det är en mycket dålig idé att använda en CLOB-datatyp för en kolumn som borde vara VARCHAR2(1). Förutom omkostnaderna (som faktiskt är minimala, eftersom Oracle kommer att behandla inline-CLOBs på <4000 tecken som VARCHAR2) bör vi alltid sträva efter att använda den mest exakta representationen av vår data i schemat:det är bara bra praxis.

Det här verkar verkligen vara ett problem med DevArt-verktyget, eller kanske din förståelse för hur man använder det (ingen anstöt). Det borde finnas något sätt för dig att specificera datatypen för en entitets attribut och/eller ett sätt att mappa dessa specifikationer till Oracles fysiska datatyper. Jag ber om ursäkt om detta verkar lite vagt, jag är inte bekant med produkten.

Så det här är det grundläggande problemet:

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>

Vi kan fixa det genom att använda DDL för att ändra tabellstrukturen. Eftersom schemat har många sådana kolumner är det värt att automatisera processen. Denna funktion tar bort den befintliga kolumnen och återskapar den som en VARCHAR2. Den erbjuder möjligheten att migrera data i kolumnen CLOB till kolumnen VARCHAR2; du behöver förmodligen inte detta, men det finns där för fullständighetens skull. (Detta är inte produktionskvalitetskod - den behöver felhantering, hantera NOT NULL-begränsningar, etc.)

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

Så låt oss ändra den kolumnen...

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

PL/SQL procedure successfully completed.

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

SQL>

Att anropa denna procedur kan automatiseras eller skriptas på vanliga sätt.



  1. Laravel Global Settings Model

  2. Hur kan jag tilldela infogat utdatavärde till en variabel i sql-servern?

  3. Är det möjligt att få en historik över frågor gjorda i postgres

  4. Hur dyra är implicita konverteringar på kolumnsidan?