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

Administration Oracle Discussion :

Commande COPY FROM


Sujet :

Administration Oracle

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 44
    Points : 36
    Points
    36
    Par défaut Commande COPY FROM
    Bonjour !

    Rédigeant un script de migration de BD sous Oracle, j'ai découvert la fonction COPY FROM.
    Fort pratique et d'aspect simple, cette fonction me pose cependant un problème d'utilisation, sur lequel j'aimerais votre avis:

    EXEMPLE:
    J'ai une table A avec un champ ID et un champ NAME.
    J'ai dans ma nouvelle base une table Aprime avec les champs ID et NAME, et en plus un champ COMMENTS.
    Je fais donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    COPY FROM usr/pwd@BD1 TO usr/pwd@BD2 insert Aprime(ID, NAME, COMMENTS) 
    using select ID, NAME, '' from AIRCRAFT;
    Dans la colonne COMMENTS, j'aurai toujours une chaine vide.

    PROBLEME:
    Si mon nouveau champ est une clé étrangère, style otherTable_ID qui peut être null, comment faire ? Evidemment, ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    COPY FROM usr/pwd@BD1 TO usr/pwd@BD2 insert Aprime(ID, NAME, otherTable_ID) 
    using select ID, NAME, null from AIRCRAFT;
    me retourne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CPY-0005: Non-concordance entre les attributs des colonnes source et cible.
    Merci pour vos idées ou conseils.

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 44
    Points : 36
    Points
    36
    Par défaut
    Je viens de trouver une solution qui ne me satisfait par car elle n'est pas propre, mais elle a le mérite de marcher:
    Je crée un objet dans la table otherTable avec pour ID la valeur 0,
    Je commite,
    Je fais mon COPY FROM en insérant 0 dans la colonne requise,
    Je remplace toutes les valeurs 0 par NULL dans la table copiée,
    Je supprime l'enregistrement de la table otherTable avec ID = 0.

    Si quelqu'un a quelque chose de plus simple, je suis tout ouïe ! (ou tout vue)

  3. #3
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Et ça ça marche pas ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    COPY FROM usr/pwd@BD1 TO usr/pwd@BD2 INSERT Aprime(ID, NAME) 
    USING SELECT ID, NAME FROM AIRCRAFT;
    Tu ne mets rien dedans, ça te met automatiquement et le tour est joué.
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 44
    Points : 36
    Points
    36
    Par défaut
    Non, j'avais effectivement testé ça au tout début.
    Il semblerait que je sois obligé de spécifier TOUTES les colonnes d'arrivée, que les champs soient requis ou non.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 44
    Points : 36
    Points
    36
    Par défaut
    J'ai demandé à l'expert Oracle de ma boîte, qui sèche aussi. Il m'a proposé plusieurs codes ; aucun ne marche.
    Parmi eux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ... SELECT ID, NAME, NULL as otherTable_ID FROM ...;
    Et la documentation sur cette fonctionnalité est, le moins qu'on puisse dire, très faible. Ou je ne sais pas chercher, ce qui n'est pas impossible non plus ;-)

  6. #6
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    il semble que ceci fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    COPY FROM usr/pwd@BD1 TO usr/pwd@BD2 INSERT Aprime(ID, NAME, otherTable_ID) 
    USING SELECT * FROM ( -
    SELECT ID, NAME, NULL as otherTable FROM AIRCRAFT);
    Testé et approuvé

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    create table fdub (id number, txt varchar2(10));
     
    Table créée.
     
    insert into fdub values (1,'a');
     
    1 ligne créée.
     
    insert into fdub values (2,'b');
     
    1 ligne créée.
     
    insert into fdub values (3,'c');
     
    1 ligne créée.
     
    create table fdub2 (id number, txt varchar2(10));
     
    Table créée.
     
     
    copy to  system/manager@dvp insert fdub2 (id) using -
    > select id from fdub;
     
    Taille tableau extrait/lié est 15. (taille du tableau est 15)
    Sera validé après opération. (COPYCOMMIT = 0)
    Taille maximum (LONG) est 80. (longueur est 80)
     
    CPY-0007: La liste sélectionnée compte moins de colonnes que la table cible
     
    copy to  system/manager@dvp insert fdub2 (id,txt) using -
    > select * from (select id, NULL as txt from fdub);
     
    Taille tableau extrait/lié est 15. (taille du tableau est 15)
    Sera validé après opération. (COPYCOMMIT = 0)
    Taille maximum (LONG) est 80. (longueur est 80)
       3 lignes sélectionnées à partir de la connexion DEFAULT HOST.
       3 lignes insérées dans FDUB2.
       3 lignes validées en FDUB2 à system@dvp.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 44
    Points : 36
    Points
    36
    Par défaut
    C'est sensé marcher sur du 9i ?

    J'ai encore un soucis, mais je dois avoir une petite erreur dans ma syntaxe... à vérifier.

  8. #8
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    oui, je suis en 9i

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 44
    Points : 36
    Points
    36
    Par défaut
    Je me corrige:
    ça marche très bien pour un champ qui n'est pas mappé, style une chaine de caractère.
    Par contre quand je fais la même manip' sur une clé étrangère, il aime beaucoup moins

    @Fred_D: Tu peux tester et confirmer, s'il te plait ?

  10. #10
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    si tu fournis un petit jeu de test j'essayerai avec plaisir

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 44
    Points : 36
    Points
    36
    Par défaut
    ouch...
    pas simple, parce que ma base est générée automatiquement par Hibernate, etc...
    Tu ne peux pas ajouter une petite clé étrangère à ton script ? Mettre un champ ID, format NUMBER, référençant une autre table, etc...

    Sinon ça attendra la rentrer, le 3 janvier.

  12. #12
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    désolé mais j'ai pas non plus que ça à faire

Discussions similaires

  1. [9.3] Commande "COPY FROM PROGRAM"
    Par PhilDeDakar dans le forum PostgreSQL
    Réponses: 0
    Dernier message: 26/02/2015, 11h42
  2. Erreur avec la commande copy
    Par Bba_M dans le forum Scripts/Batch
    Réponses: 7
    Dernier message: 14/01/2008, 16h25
  3. COPY FROM selectif
    Par nadine.mauch dans le forum PostgreSQL
    Réponses: 7
    Dernier message: 14/12/2007, 20h40
  4. Problème sur la commande COPY depuis un programme Java
    Par klereth dans le forum PostgreSQL
    Réponses: 10
    Dernier message: 10/02/2006, 14h14
  5. [pgadminIII] copy from
    Par funkadelic dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 28/06/2005, 20h39

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