sql >> Database >  >> RDS >> Oracle

CLOB vs. VARCHAR2 en zijn er andere alternatieven?

Het is een heel slecht idee om een ​​CLOB-gegevenstype te gebruiken voor een kolom die VARCHAR2(1) zou moeten zijn. Afgezien van de overhead (die in feite minimaal is, aangezien Oracle inline CLOB's van <4000 tekens als VARCHAR2 zal behandelen) moeten we er altijd naar streven om de meest nauwkeurige weergave van onze gegevens in het schema te gebruiken:het is gewoon een goede gewoonte.

Dit lijkt echt een probleem met de DevArt-tool, of misschien uw begrip van hoe u het moet gebruiken (geen overtreding). Er zou een manier voor u moeten zijn om het datatype van het attribuut van een entiteit te specificeren en/of een manier om die specificaties toe te wijzen aan de fysieke datatypes van Oracle. Mijn excuses als dit een beetje vaag lijkt, ik ben niet bekend met het product.

Dit is dus het basisprobleem:

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>

We kunnen het oplossen door DDL te gebruiken om de tabelstructuur te wijzigen. Omdat het schema veel van dergelijke kolommen heeft, is het de moeite waard om het proces te automatiseren. Met deze functie wordt de bestaande kolom verwijderd en opnieuw gemaakt als een VARCHAR2. Het biedt de mogelijkheid om gegevens in de CLOB-kolom naar de VARCHAR2-kolom te migreren; je hebt dit waarschijnlijk niet nodig, maar het is er voor de volledigheid. (Dit is geen code voor de productiekwaliteit - het vereist foutafhandeling, het beheren van NIET NULL-beperkingen, enz.)

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

Dus laten we die kolom veranderen...

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

PL/SQL procedure successfully completed.

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

SQL>

Het aanroepen van deze procedure kan op de gebruikelijke manieren worden geautomatiseerd of gescript.



  1. Postgres-datumnotaties en hun verschillende functies verkennen

  2. Mysql2 gem voor Ruby on Rails installeren met Mac OSX 10.6

  3. postgresql-extractiefunctie bron

  4. Hoe pg_sleep() werkt in PostgreSQL