Oracle
 sql >> Base de données >  >> RDS >> Oracle

CLOB vs VARCHAR2 et existe-t-il d'autres alternatives ?

C'est une très mauvaise idée d'utiliser un type de données CLOB pour une colonne qui devrait être VARCHAR2(1). Outre les frais généraux (qui sont en fait minimes, car Oracle traitera les CLOB en ligne de <4000 caractères comme VARCHAR2), nous devons toujours nous efforcer d'utiliser la représentation la plus précise de nos données dans le schéma :c'est juste une bonne pratique.

Cela semble vraiment être un problème avec l'outil DevArt, ou peut-être votre compréhension de la façon de l'utiliser (sans offense). Il devrait y avoir un moyen pour vous de spécifier le type de données de l'attribut d'une entité et/ou un moyen de mapper ces spécifications aux types de données physiques d'Oracle. Je m'excuse si cela semble un peu vague, je ne connais pas le produit.

Voici donc le problème de base :

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>

Nous pouvons le réparer en utilisant DDL pour modifier la structure de la table. Étant donné que le schéma comporte de nombreuses colonnes de ce type, il est intéressant d'automatiser le processus. Cette fonction supprime la colonne existante et la recrée en tant que VARCHAR2. Il offre la possibilité de migrer les données de la colonne CLOB vers la colonne VARCHAR2 ; vous n'en avez probablement pas besoin, mais il est là pour être complet. (Ce n'est pas du code de qualité de production - il nécessite une gestion des erreurs, la gestion des contraintes NOT NULL, 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;
/

Alors, changeons cette colonne...

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

PL/SQL procedure successfully completed.

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

SQL>

L'appel de cette procédure peut être automatisé ou scripté de la manière habituelle.