Reprise de données : exemples simples

Très régulièrement, lors d'upgrade d'une application, la base doit subir quelques modifications. C'est notamment le cas lorsque celle-ci permet une extension d'un type de colonne vers un plus permissif : pour migrer les données d'un type NUMBER(5) à NUMBER(10) ou de VARCHAR2(50) vers VARCHAR2(250), aucun problème : un simple alter sur la table prend en compte les modifications.

alter table t1 modify colamig number(10);
alter table t2 modify colamig varchar2(250);


Pour migrer, par contre une colonne NUMBER(x) vers VARCHAR2(y), l'opération est moins simple. En effet, il faut appliquer, pour chaque colonne, une fonction de changement de type : to_char().
Pour effectuer la reprise de données, il s'agit alors de passer par la création d'une colonne temporaire où seront stockées les valeurs modifiées.

Deux cas se présentent :
- l'ordre des colonnes n'a pas d'importance ; on peut alors utiliser la nouvelle colonne créée en la renommant après avoir supprimer l'ancienne (à partir d'Oracle 9i):
alter table t1 add column coltemp varchar2(250);
update t1 set coltemp = to_char(colamig);
alter table t1 drop column colamig;
alter table t1 rename column coltemp to colamig;



- l'ordre des colonnes a une importance (problème quelque part dans l'implémentation, mais ça arrive) ; il faut alors mettre à null toute la colonne avant d'effectuer l'alter et refaire l'opération inverse de la colonne créée vers la colonne à modifier :
alter table t1 add column coltemp varchar2(250);
update t1 set coltemp = to_char(colamig), colamig = null;
alter table t1 modify colamig varchar2(250);
update t1 set colamig = coltemp;
alter table t1 drop column coltemp;


Lorsque la reprise de données porte sur un volume important, il est bon de committer un certains nombre de fois (voir l'article 'injection et traitements de masse')

De plus,lorsqu'il s'agit de migrer un grand nombre de colonnes ou de table, on passe alors par l'utilisation de tables temporaires (article à venir).




Vous n'avez pas trouver réponse à votre question ? Préciser votre recherche :

Catégories