IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Oracle Discussion :

Changement type de champ: ORA-01439 [FAQ]


Sujet :

Oracle

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Changement type de champ: ORA-01439
    Je dois changer dans une table un type de champ, passer du type NUMBER à VARCHAR2, pour faire se changement ma table doit être vide, mais ma base étant en production je ne peux pas l'arrêter facilement.

    Existe-il un moyen de changer le type du champ sans vider la table.
    Je vous remercie par avance de vos réponses

    [Modération : titre original ("Changement type de champ") édité par LeoAnderson]

  2. #2
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    Vous voulez changer de type d'une colonne sur une base en prod ???
    enfin, c'est vous qui voyez ! ;-)

    Sinon, une solution consiste à faire :
    1. On duplique la table avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE TABLE Table_Temp_VarChar
    AS
    SELECT A,B,C,D, To_CHAR(E) AS E FROM TableActuelle;
    2. On efface la table avec le numérique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DROP TABLE TableActuelle;
    3. On renomme la table temporaire avec le nom d'origine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RENAME Table_Temp_VarChar TO TableActuelle;
    En procédant ainsi, vous n'aurez pas perdu de données mais attention vous serez obligé de recréer les indexes et les triggers associés à la table en question

    Sinon, vous pouvez également :
    1. Exporter toutes les données de la table
    2. Vider la table (par un delete, évitez le truncate si jamais ça devait mal se passer....)
    3. Modifier le type de la colonne
    4. Importer les données avec IGNORE=Y

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    En fait je vais travailler avec un user de test pour mettre en place une stratégie de modification.

    J'avais aussi pensé à la deuxième solution, le problème c'est que j'ai 2 séquences associées à cette table, et 2 tables liées à la clé primaire de ma table à modifier.
    La clé primaire est incrémentée par 2 séquences, les critéres d'incrémentation sont définis dans un trigger.

    Concrètement ma table contient les données des BL de livraisons. Ces BL sont de 2 types, Cxxxxxxx ou Fxxxxxxx, ils constituent la clé primaire de ma table. Le champ à modifier contient le n° d'émargement qui est passé de numérique à alphanumérique.
    En aucun cas ces n° de BL ne peuvent être modifiés.

    Si je fais un DELETE de mes 3 tables pour pouvoir modifier mon champ, quand je vais faire un IMP de mes tables sans avoir supprimé mes séquences est-ce que je ne risque pas d'avoir une renumérotation de mes BL ?

  4. #4
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    Euh... j'ai pas bien compris ?
    La colonne à modifer n'est pas référencée par d'autres tables ?

    Sinon, si ce sont des contraintes qui vous posent des cas de conscience pour la suppression, vous pouvez les désactiver et les réactiver après la modification ? quant aux triggers, c'est pareil, vous pouvez les rendre disable avant la suppression et les réactiver après l'import !

  5. #5
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut Re: Changement type de champ
    Citation Envoyé par PATMOR
    Je dois changer dans une table un type de champ, passer du type NUMBER à VARCHAR2, pour faire se changement ma table doit être vide, mais ma base étant en production je ne peux pas l'arrêter facilement. Existe-il un moyen de changer le type du champ sans vider la table.
    Je vous remercie par avance de vos réponses
    pourquoi la table doit être vide ???

    qu'est-ce qui vous empêche de passer l'ordre suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE la_table MODIFY la_colonne VARCHAR2(20) ;
    :
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  6. #6
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    Juste une erreur Oracle, je suppose ! ;-)

    SQL> create table scott.test_modify (A varchar2(10), B Number(8,2) );

    Table created

    SQL> insert into scott.test_modify values ('TOTO', 76.2);

    1 row inserted

    SQL> commit;

    Commit complete

    SQL> alter table scott.test_modify modify B VARCHAR2(20);

    alter table scott.test_modify modify B VARCHAR2(20)

    ORA-01439: une colonne doit être vide pour pouvoir modifier son type de données
    (testé en 10g)

  7. #7
    Membre régulier
    Inscrit en
    Février 2004
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 97
    Points : 110
    Points
    110
    Par défaut
    Es ce que ce ne serait pas plus simple de creer un nouveau champ avec le Type voulu, y copier les donnees du champ a renomer puis l'effacer et enfin renomer le champ cree.
    A partir de 9i, il y a la package DBMS_REDEFINITION qui permet de faire toutes ces manips online.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Je vous remercie tous pour vos réponses.
    Je vais mettre en stand-by mes recherches pour quelques jours faute de temps.
    Je cloturerai ma demande quand j'aurai fini mes tests, je vous indiquerai la méthode que j'ai adopté.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Méthode utilisée :

    1-Création d'une table temporaire de même structure que ma table à modifier mais avec le nouveau type de champ

    2 - Insertion des données

    3 - Suppression de ma table

    4 - Renomer ma table temporaire

    5 - Création des contraites,des indexes et des triggers associés à ma table

    6 - Tester mon application

    C'est un peu lourd, Oracle devrait offrir la possibilité d'une modification dynamique.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème sur un changement de type de champs
    Par blond1888 dans le forum SQL
    Réponses: 4
    Dernier message: 15/01/2007, 10h29
  2. changement type de champ
    Par albo69 dans le forum Requêtes
    Réponses: 5
    Dernier message: 21/12/2005, 21h43
  3. [Struts][Conseil] type de champs ActionForm
    Par Sniper37 dans le forum Struts 1
    Réponses: 10
    Dernier message: 12/04/2005, 15h43
  4. [Oracle][Delphi 7] Problème type de champ
    Par tiennos dans le forum Bases de données
    Réponses: 3
    Dernier message: 16/07/2004, 10h17
  5. [ADO] Constantes des types de champ
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 05/09/2002, 11h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo