2010-08-24 5 views

Répondre

5

Voici quelques données de test:

SQL> select * from MACAddresses 
    2/

    COMPUTER MACADDRESS 
---------- ------------ 
     100 123456789abc 
     200 acef35dd6ecc 

SQL> 

L'ajout de la nouvelle colonne est assez simple:

SQL> alter table MACAddresses 
    2  add corrected_MACAddress varchar2(17) 
    3/

Table altered. 

SQL> 

Notez que vous ne pouvez pas le rendre NOT NULL à ce stade, parce que vous avez déjà quelques dossiers dans la table. Donc, si vous voulez appliquer une telle contrainte, vous devez d'abord la remplir.

C'est la manière la plus simple de mettre à jour la nouvelle colonne.

SQL> update MACAddresses 
    2  set corrected_MACAddress = substr(macaddress, 1,2)||':'|| 
    3         substr(macaddress, 3,2)||':'|| 
    4         substr(macaddress, 5,2)||':'|| 
    5         substr(macaddress, 7,2)||':'|| 
    6         substr(macaddress, 9,2)||':'|| 
    7         substr(macaddress, 11,2) 
    8/

2 rows updated. 

SQL> select * from MACAddresses 
    2/

    COMPUTER MACADDRESS CORRECTED_MACADDR 
---------- ------------ ----------------- 
     100 123456789abc 12:34:56:78:9a:bc 
     200 acef35dd6ecc ac:ef:35:dd:6e:cc 

SQL> 

Maintenant, si vous aviez un modèle plus complexe, ou si vous voulez effectuer cette opération sur une base regukar je vous suggère de dépenser l'effort pour la transformer en une fonction, et peut-être supprimer cette répétition en même temps.

Enfin, si vous voulez appliquer une contrainte obligatoire, vous pouvez:

SQL> alter table MACAddresses 
    2  modify corrected_MACAddress not null 
    3/

Table altered. 

SQL> 
+0

Vous pouvez utiliser cette astuce « de double connecter par niveau » pour faire un nombre arbitraire de scissions. Ou une expression rationnelle incompréhensible sur Oracle 10! – JulesLt

+1

Sur 11g, ce serait un bon candidat pour une colonne virtuelle, ce qui assurerait qu'il est toujours compatible avec le champ primaire. – Allan

Questions connexes