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 :

Permuter deux champs dans la structure d'une table


Sujet :

Oracle

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 53
    Points : 45
    Points
    45
    Par défaut Permuter deux champs dans la structure d'une table
    Bonjour,

    J'ai une table TOTO avec la structure suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SQL> desc TOTO
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     INDX                                      NOT NULL NUMBER
     KEY                                NOT NULL VARCHAR2(1)
     PRIORITY                                           NUMBER(6)
     MODE                                             NUMBER(1)
     TYPE_OF_CLIENT                                   VARCHAR2(3)
     PLAN_ID                                  VARCHAR2(64)
     TRANSACTION_TYPE                                 NUMBER(2)
     UNIT                                       VARCHAR2(5)
    J'aimerai inverser le champ TRANSACTION_TYPE avec PLAN_ID. Ca donnerai ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SQL> desc TOTO
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     INDX                                      NOT NULL NUMBER
     KEY                                NOT NULL VARCHAR2(1)
     PRIORITY                                           NUMBER(6)
     MODE                                             NUMBER(1)
     TYPE_OF_CLIENT                                   VARCHAR2(3)
     TRANSACTION_TYPE                                 NUMBER(2)
     PLAN_ID                                  VARCHAR2(64)
     UNIT                                       VARCHAR2(5)
    J'ai vu sur le net, avec des ALTER tables, il n'y a pas de syntaxe pour permuter. Des idées ?

    Merci d'avance pour votre réponse.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 239
    Points : 12 866
    Points
    12 866
    Par défaut
    Bonjour,
    Quel est l'intérêt de permuter ces deux colonnes dans la table ?

    Tatayo.

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 53
    Points : 45
    Points
    45
    Par défaut
    Je reçoi un fichier csv d'une autre équipe que je dois charger dans cette table, et je dois permuter ces deux champs pour m'adapter à l'ordre du contenu du csv.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 239
    Points : 12 866
    Points
    12 866
    Par défaut
    Je ne dois pas être bien réveillé, mais je ne vois pas bien le lien entre l'ordre des colonnes dans le fichier à importer, et l'ordre de déclaration des colonnes dans la table... en tout cas je ne me suis jamais posé ce genre de question.

    Comment est importé le fichier en question ?

  5. #5
    Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 53
    Points : 45
    Points
    45
    Par défaut
    Justement c'est un script de load qui charge les fichiers csv. Ce script est livré par une autre équipe et je n'est pas le droit de le modifier ou le toucher

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 098
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 098
    Points : 28 409
    Points
    28 409
    Par défaut
    Dans la théorie des SGBD, l'ordre des colonnes d'une table est indifférent, une colonne étant accédée par son nom et non sa position.
    De ce fait, il semble normal qu'aucune instruction ne soit proposée pour modifier l'ordre des colonnes d'une table.
    Il ne reste donc d'autre solution que de faire modifier le script de chargement pour l'adapter à la structure, sinon recréer la table avce l'ordre des colonnes attendu par le script de chargement.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  7. #7
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    azahiri! Puisque tu insistes; est ce que tu as compte DBA?
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  8. #8
    Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 53
    Points : 45
    Points
    45
    Par défaut
    Non mais j'ai peut être une idée. on peut changer le nom d'une colonne et son type. Je le fais pour les deux et le tour est joué. Vous en pensez quoi ?

  9. #9
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    la table en question , est elle vide?
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  10. #10
    Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 53
    Points : 45
    Points
    45
    Par défaut
    Oui

  11. #11
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    Donc, pas de risque de perte de données.
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  12. #12
    Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 53
    Points : 45
    Points
    45
    Par défaut
    donc je peux faire cette manip ?

    Non mais j'ai peut être une idée. on peut changer le nom d'une colonne et son type. Je le fais pour les deux et le tour est joué. Vous en pensez quoi ?

  13. #13
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Allter table TOTO drop column PLAN_ID ;
    Allter table TOTO drop column UNIT ;
    Allter table TOTO add PLAN_ID   VARCHAR2(64);
    Allter table TOTO add UNIT   VARCHAR2(5);
    Alter est pas Allter, je sais.je n'ai pas pu poster avec alter .
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  14. #14
    Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 53
    Points : 45
    Points
    45
    Par défaut
    Avec cette solution ça ne peut pas marcher parce que les colonnes que je veux inverser ne sont pas a la fin. C'est au milieu, si je fais des drop et des add, je risque de positionner ces deux colonnes en fin de la table.

  15. #15
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    Sinon tu peux creer une nouvelle table comme suite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    create table new_table as 
    select les_colonnes_ comme_tu_veux ..... from TOTO
    En revoyant toutes containtes. Puis tu supprimes TOTO et enfin tu renomme new_table avec TOTO. Et ça ira.
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  16. #16
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 383
    Points
    18 383
    Par défaut
    Si la table est vide, supprimez-là et recréez-là.

  17. #17
    Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 53
    Points : 45
    Points
    45
    Par défaut
    Ok, merci les amis pour votre aide.

  18. #18
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Points : 1 359
    Points
    1 359
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Dans la théorie des SGBD, l'ordre des colonnes d'une table est indifférent, une colonne étant accédée par son nom et non sa position.
    Oracle accède d’abord à un block de données qui peut contenir un enregistrement (row). Cet enregistrement contient un header indiquant si l’enregistrement est ‘’verroué ‘’ou pas, combien de colonnes il contient etc… Puis il y a, pour chaque colonne, sa taille (length) et son contenu. Pour accéder à la colonne numérotée 2 par exemple, Oracle doit d’abord accéder à la colonne 1 et sur la base de la taille de cette colonne 1 il trouve la position de la colonne 2 (et ainsi de suite). Il est donc évident qu’une colonne placée au début de l’enregistrement est retrouvée plus rapidement que celle qui est à la fin. Surtout lorsque la table contient beaucoup de colonnes.

    Par contre, je ne veux pas embrouiller les lecteurs, en forçant le trait sur l’importance de la position d’une colonne quant à la performance d’une requête car en effet c’est la localisation du block qui peut être plus problématique que ne le sera la localisation d’une colonne dans ce même block. Mais il faut savoir que la position de la colonne, certes importe peu, mais importe quand même.
    Bien Respectueusement
    www.hourim.wordpress.com

    "Ce qui se conçoit bien s'énonce clairement"

  19. #19
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Points : 807
    Points
    807
    Par défaut
    Citation Envoyé par Mohamed.Houri Voir le message
    Il est donc évident qu’une colonne placée au début de l’enregistrement est retrouvée plus rapidement que celle qui est à la fin. Surtout lorsque la table contient beaucoup de colonnes.
    Je suis curieux d'en savoir plus et de pouvoir quantifier ceci.
    Etant donné que la lecture physique se faisait par blocks mémoire (8k par exemple). Qu'on veuille récupérer une ligne, ou plusieurs, voir une simple colonne d'une seule ligne.

    Edit:
    Ca me fait penser que la seule chose que je sais sur l'ordre des colonnes, c'est qu'il faut éviter de mettre les NOT NULL à la fin. Pour certains types, ça consomme de l'espace (pour les number, mais pas pour les VC2). Si il y a d'autres choses intéressantes, je suis preneur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    create table tmp (vc varchar2(4000), vc2 varchar2(4000), vc3 varchar2(4000) not null,n number not null) pctfree 0;
    create table tmp2 (n number not null, vc varchar2(4000),vc2 varchar2(4000), vc3 varchar2(4000)) pctfree 0;
     
    create table tmp3 (n1 number,n2 number,n3 number,n number not null) pctfree 0;
    create table tmp4 (n number not null,n1 number,n2 number,n3 number) pctfree 0;
     
    insert into tmp  (vc,vc2,vc3,n) select 'a','b','c',level from dual connect by level<1e4;
    insert into tmp select * from tmp;
    insert into tmp2 (vc,vc2,vc3,n) select 'a','b','c',level from dual connect by level<1e4;
    insert into tmp2 select * from tmp2;
     
    insert into tmp3 (n) select level from dual connect by level<1e4;
    insert into tmp3 select * from tmp3;
    insert into tmp4 (n) select level from dual connect by level<1e4;
    insert into tmp4 select * from tmp4;
     
    select segment_name, segment_type, bytes, blocks, extents from user_segments order by blocks;
    Et effectivement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SEGMENT_NAME	SEGMENT_TYPE	BYTES	BLOCKS	EXTENTS
    TMP4	            TABLE	262144   32	4
    TMP3	            TABLE	327680	  40	5
    TMP	            TABLE	393216	  48	6
    TMP2	            TABLE	393216	  48	6

  20. #20
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par Mohamed.Houri Voir le message
    ...Mais il faut savoir que la position de la colonne, certes importe peu, mais importe quand même.
    Il ne vous reste qu’à élaborer le test permettant de mettre en évidence et de mesurer l'effet.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [MySQL] modifier le début de deux champs dans plusieurs enregistrements d'une même table
    Par corbin dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 19/04/2011, 09h40
  2. Réponses: 2
    Dernier message: 25/07/2007, 13h39
  3. Requête SELECT avec deux champs dans une colonne ??
    Par fredhali2000 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 08/06/2006, 10h41
  4. Additionner deux champs dans une requête
    Par eddyG dans le forum Access
    Réponses: 5
    Dernier message: 30/05/2006, 18h00
  5. Choix entre deux champs dans une requete
    Par Pico10 dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 27/07/2005, 15h36

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