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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 44
    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
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 44
    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 Expert 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
    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é.

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 44
    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
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 44
    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
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    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.

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