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

Sql Developer Oracle Discussion :

Importer des données ne marche pas pour gros fichiers


Sujet :

Sql Developer Oracle

  1. #1
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 219
    Points : 1 438
    Points
    1 438
    Par défaut Importer des données ne marche pas pour gros fichiers
    Bonjour,

    Je parle ici de l'action "Importer des données" en faisant un clic droit sur une table dans SQL Developer. Je suis sous Oracle 11g avec SQL Developer version 1.5.5 l'accompagnant.

    J'ai des fichiers CSV de 3 tables à charger avec pour ma base de données. Chacun de ces fichiers contient respectivement: 20000 lignes, 40000 lignes et 130000 lignes de données.

    Le soucis c'est que lorsqu'on clique enfin sur le bouton "Fin", rien ne se passe alors que tous les paramètres d'importation sont à SUCCESS.



    J'ai essayé en enlevant des lignes dans les CSV et ne garder qu'une centaine et là l'importation passe, c'est pour cela que je me disais que c'est à cause des tailles des fichiers. Est-ce un bug ou est-ce normal? Ce n'est que 20000 lignes à 130000 lignes non????

    Merci d'avance.
    Images attachées Images attachées  

  2. #2
    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 386
    Points
    18 386
    Par défaut
    Vous pouvez passer par une table externe, c'est moins clickdromesque et ça demande de coder un peu, mais vous n'aurez pas ce genre de limitations.

  3. #3
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 219
    Points : 1 438
    Points
    1 438
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Vous pouvez passer par une table externe, c'est moins clickdromesque et ça demande de coder un peu, mais vous n'aurez pas ce genre de limitations.
    Expliquez un peu car je suis encore novice en Oracle. Merci!

  4. #4
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Une table externe, pour Oracle, c'est lui donner l'adresse d'un fichier. Il va alors considérer ce fichier comme une table (il faut bien sûr lui donner quelques précisions sur le format utilisé). À partir de là, on peut faire du SELECT sur cette table, et donc notamment du INSERT INTO table(colonnes) SELECT [colonnes] FROM tableExterne.

    Un peu de lecture locale sur les tables externes !

  5. #5
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 219
    Points : 1 438
    Points
    1 438
    Par défaut
    J'ai compris le principe de la table externe d'Oracle:
    - pour accéder au fichier CSV, un répertoire (Directory) doit être créé dans la base de données
    - faire un "grant read, write on directory" à l'utilisateur qui doit y accéder
    - enfin, la syntaxe de la création de la table est la suivante:
    Code sql : 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
    CREATE TABLE Ma_Table (
      "ASS_ID" VARCHAR2(100),
      "ASS_ID_UNIQUE" VARCHAR2(100),
      "ASS_IMMA_NUM" VARCHAR2(100),
      "ASS_IMMA_SEC" VARCHAR2(100),
      "ASS_IMMA_COMP" VARCHAR2(100),
    )
            ORGANIZATION EXTERNAL ( TYPE ORACLE_LOADER
                            DEFAULT DIRECTORY mydirectory
                            ACCESS PARAMETERS ( records delimited by newline
                                                badfile MYDIRECTORY:'Ma_Table.bad'
                                                logfile MYDIRECTORY:'Ma_Table.log'
                                                fields terminated by ','
                                                missing field values are null)
            LOCATION ('DATA_Ma_Table.csv'))
            PARALLEL REJECT LIMIT UNLIMITED;
    Ça marche!

    Le soucis maintenant c'est que je viens de créer une table externe sur un fichier CSV de 20465 lignes. Or lorsque je fais "SELECT COUNT(*) FROM Ma_Table", je n'ai que 19918 nombres de lignes.
    J'ai fait un export vers CSV de la table externe via SQL Developer, croyant que le chargement s'est arrêté avant la fin, et ben les dernières lignes du fichier CSV utilisé pour la table externe sont les même que la table externe en elle-même.

    Où sont passés les 547 lignes?
    Est-ce que c'est un bug courant des tables externes, des lignes sont avalées. En effet, j'ai supprimé la table externe et l'a recréé, j'obtiens maintenant 19122 lignes, toujours pas les 20465. Pourquoi??

  6. #6
    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 386
    Points
    18 386
    Par défaut
    Non il n'y a pas ce genre de bug avec les tables externes, c'est très fiable.
    Regardez vos fichier .log et .bad, ça vous donnera probablement un aperçu des lignes manquantes.

  7. #7
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Y a t-il quelque chose dans les badfile et logfile ?
    [edit]grilled...

  8. #8
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 219
    Points : 1 438
    Points
    1 438
    Par défaut
    Merci skuatamad pour la remarque, effectivement, il y a effectivement le fichier .bad créé et j'ai regardé dans le log et il y a des erreurs au milieu donc les lignes ignorées.

    J'ai continué la création de table externe pour un autre fichier CSV cette fois de 94 lignes seulement.
    Et ben, seulement 1 ligne est créée avec bizarrement comme valeur du dernier champ, la valeur du premier champ du ligne suivant. Bizarre!
    Voici ma requête sql tout ce qu'il y a de plus normal:
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    CREATE TABLE MyTable (
      "ASS_ID" VARCHAR2(100),
      "ASS_ID_UNIQUE" VARCHAR2(100),
      "ASS_IMMA_NUM" VARCHAR2(100),
      "ASS_IMMA_SEC" VARCHAR2(100),
      "ASS_IMMA_COMP" VARCHAR2(100),
      "ASS_IMMA_MANU" VARCHAR2(100),
      "ASS_NOM" VARCHAR2(255),
      "ASS_PRENOMS" VARCHAR2(255),
      "ASS_SURNOM" VARCHAR2(255),
      "ASS_DENOMINATION" VARCHAR2(500),
      "ASS_SIGLE" VARCHAR2(50),
      "ASS_NOM_COMM" VARCHAR2(250),
      "ASS_CAPITAL" VARCHAR2(100), 
      "ASS_NAISSANCE" VARCHAR2(100),
      "PAY_ID_NAISS" VARCHAR2(100),
      "COM_ID_NAISS" VARCHAR2(150),
      "ASS_NAISS_REG_AUTRE" VARCHAR2(50),
      "ASS_NAISS_COM_AUTRE" VARCHAR2(50),
      "ASS_PERE_NOM" VARCHAR2(50),
      "ASS_MERE_NOM" VARCHAR2(50),
      "ASS_CONJOINT_NOM" VARCHAR2(255),
      "ASS_ADRESSE" VARCHAR2(255),
      "ASS_LIEU_NAISS" VARCHAR2(255),
      "PAY_ID_ADR" VARCHAR2(100),
      "COM_ID_ADR" VARCHAR2(100),
      "ASS_ADR_REG_AUTRE" VARCHAR2(500),
      "ASS_ADR_COM_AUTRE" VARCHAR2(500),
      "ASS_DEBUT" VARCHAR2(100),
      "ASS_DUREE" VARCHAR2(30),
      "ASS_FIN" VARCHAR2(100),
      "ASS_CLOTURE" VARCHAR2(100),
      "ASS_VAL_NOMI" VARCHAR2(30),
      "ASS_NOMBRE" VARCHAR2(30),
      "ASS_OBJET" VARCHAR2(255),
      "ASS_INFO_ORIGINE" VARCHAR2(256),
      "ASS_ETAB_DENOMINATION" VARCHAR2(250),
      "ASS_ETAB_ENSEIGNE" VARCHAR2(50),
      "ASS_ETAB_ADRESSE" VARCHAR2(500),
      "PAY_ID_ETAB_ADR" VARCHAR2(100),
      "COM_ID_ETAB_ADR" VARCHAR2(100),
      "ASS_ETAB_ADR_REG_AUTRE" VARCHAR2(50),
      "ASS_ETAB_ADR_COM_AUTRE" VARCHAR2(50),
      "ASS_ETAB_SIEGE_ADRESSE" VARCHAR2(500),
      "PAY_ID_ETAB_SIEGE" VARCHAR2(15),
      "COM_ID_ETAB_SIEGE" VARCHAR2(15),
      "ASS_ETAB_SIEGE_ADR_REG_AUTRE" VARCHAR2(50),
      "ASS_ETAB_SIEGE_ADR_COM_AUTRE" VARCHAR2(50),
      "ASS_ETAB_ACTIVITES" VARCHAR2(500), 
      "ASS_ETAB_DEBUT" VARCHAR2(100),
      "ASS_ETAB_ORIGINE" VARCHAR2(500),
      "ASS_ETAB_INFO_ORIGINE" VARCHAR2(256),
      "ASS_ETAB_DUREE" VARCHAR2(100),
      "ASS_ETAB_FIN" VARCHAR2(100),
      "ASS_ETAB_CLOTURE" VARCHAR2(100),
      "ASS_ETAB_IMMA_DATE" VARCHAR2(100),
      "ASS_ETAB_OBS" VARCHAR2(500), 
      "ASS_ETAB_DPS_NOM" VARCHAR2(50),
      "ASS_ETAB_DPS_PRENOMS" VARCHAR2(50),
      "ASS_ETAB_DPS_ADRESSE" VARCHAR2(50),
      "PAY_ID_ETAB_DPS" VARCHAR2(100),
      "COM_ID_ETAB_DPS" VARCHAR2(100),
      "ASS_ETAB_DPS_REG_AUTRE" VARCHAR2(50),
      "ASS_ETAB_DPS_COM_AUTRE" VARCHAR2(50),
      "ASS_ETAB_OBS_FONDS" VARCHAR2(256),
      "ASS_SIEGE_ETRANGER" VARCHAR2(100),
      "ASS_INCOMPLET" VARCHAR2(100),
      "ASS_PIECES_ATTENTE" VARCHAR2(256),
      "ASS_DATE_MAX_REGUL" VARCHAR2(100),
      "ASS_DEBLOQUE" VARCHAR2(100),
      "ASS_RADIE" VARCHAR2(100),
      "ASS_VALIDE" VARCHAR2(100),
      "TAS_ID" VARCHAR2(100),
      "DEV_ID" VARCHAR2(100),
      "NAT_ID" VARCHAR2(100),
      "DPS_ID" VARCHAR2(100),
      "FJU_ID" VARCHAR2(100),
      "EXR_ID" VARCHAR2(100),
      "SMA_ID" VARCHAR2(100),
      "RMA_ID" VARCHAR2(100),
      "GRF_ID" VARCHAR2(100),
      "ORF_ID" VARCHAR2(100),
      "ORI_ID" VARCHAR2(100),
      "USER_CRE" VARCHAR2(50),
      "DATE_CRE" VARCHAR2(50),
      "USER_UPD" VARCHAR2(50),
      "DATE_UPD" VARCHAR2(50),
      "ASS_SEXE" VARCHAR2(100),
      "ASS_NOM_DEC" VARCHAR2(100),
      "ASS_PRENOM_DEC" VARCHAR2(100),
      "ASS_ADRESSE_DEC" VARCHAR2(50),
      "PAY_ID_DEC" VARCHAR2(100),
      "COM_ID_DEC" VARCHAR2(100),
      "ASS_DEC_COM_AUTRE" VARCHAR2(50),
      "ASS_DEC_REG_AUTRE" VARCHAR2(50),
      "ASS_ETAB_ETRANGER_ADRESSE" VARCHAR2(500),
      "PAY_ID_ETAB_ETRANGER" VARCHAR2(100),
      "COM_ID_ETAB_ETRANGER" VARCHAR2(100),
      "ASS_ETAB_ETRANGER_REG_AUTRE" VARCHAR2(255),
      "ASS_ETAB_ETRANGER_COM_AUTRE" VARCHAR2(255),
      "CST_ID" VARCHAR2(50),
      "STY_ID" VARCHAR2(50),
      "ASS_CIVILITE" VARCHAR2(100),
      "ASS_OBSERVATION" VARCHAR2(500), 
      "ASS_SOURCE_MODIF" VARCHAR2(255)
    )
            ORGANIZATION EXTERNAL ( TYPE ORACLE_LOADER
                            DEFAULT DIRECTORY mydirectory
                            ACCESS PARAMETERS ( records delimited by newline
                                                badfile MYDIRECTORY:'MyTable.bad'
                                                logfile MYDIRECTORY:'MyTable.log'
                                                fields terminated by ','
                                                missing field values are null)
            LOCATION ('DATA_MyTable.csv.txt'))
            PARALLEL REJECT LIMIT UNLIMITED;
    Et le fichier CSV:
    DATA_MyTable.csv.txt

  9. #9
    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 386
    Points
    18 386
    Par défaut
    Avez-vous remarqué que votre fichier est au format Unix ?
    Il faut l'indiquer à Oracle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RECORDS DELIMITED BY '\n'

  10. #10
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 219
    Points : 1 438
    Points
    1 438
    Par défaut
    merci Waldar, c'était effectivement ça la solution, le CSV a été effectivement exporté d'une machine Linux.

    Actuellement, je cherche la solution de comment faire pour les enregistrements dont certains champs utilisent des virgules (,) hors les virgules sont les séparateurs de mon CSV. Quelle dilemme!

  11. #11
    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 386
    Points
    18 386
    Par défaut
    En CSV vous avez la possibilité de qualifier les chaînes de caractères avec des guillemets. Ou vous pouvez changer le séparateur aussi !

  12. #12
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 219
    Points : 1 438
    Points
    1 438
    Par défaut
    Oui je sais que l'on peut définir le CSV avec les paramètres: terminated by et enclosed by mais on n'a plus les sources pour les réexporter, on a juste les fichiers CSV avec des quarantaines de milliers de lignes.

    Conseillez-moi un outil pour rééditer les fichiers CSV, est-ce que Excel permet de définir les terminated by et enclosed by?

  13. #13
    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
    Lol, vous avez fait ca un gromanche dimanche?

    Quel programme peut deviner que:
    lundi,mardi,mercedi,jeudi,vendredi,samedi,dimancheC'est en realite 2 champs: les jours ouvre, et les jours de week-end? Ou alors une liste de 7 jours independants.


    Si vous avez une logique, vous pouvez toujours utiliser sed. Mais si vous dans l'exemple que je vous ai propose, moi je demanderai gentiement a la personne qui a fait ca d'ajouter les " a la main (en proposant d'en faire un petit bout parce que ca ameliore l'ambiance d'equipe)

  14. #14
    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 386
    Points
    18 386
    Par défaut
    Les lignes qui ont des virgules en trop vont se retrouver dans le fichier .bad : il faudra alors les corriger à la main pour la raison évoquée par Rams7s.

  15. #15
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 219
    Points : 1 438
    Points
    1 438
    Par défaut
    En tout cas, le problème des virgules et des guillemets n'est pas le soucis initial. C'est à ceux qui m'ont fourni les CSV de me les fournir bien formés.

    Et oui c'est à corriger à la main depuis le fichier .bad!

    Une autre parade que j'ai trouvé d'un autre forum c'est bien sûr de modifier d'abord les CSV pour entourer par non pas des guillemets " mais /" et dans la création de la table external: optionally enclosed by '/"' LDRTRIM

    Mais bon, le sujet était " Importer des données ne marche pas pour gros fichiers": une des solutions sont les EXTERNAL TABLES!

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

Discussions similaires

  1. Importer des données de sql server dans un fichier excel
    Par sab_info dans le forum Développement
    Réponses: 2
    Dernier message: 30/01/2013, 09h45
  2. Réponses: 6
    Dernier message: 07/09/2009, 11h42
  3. Réponses: 0
    Dernier message: 11/06/2009, 17h13
  4. Réponses: 12
    Dernier message: 24/10/2007, 12h00
  5. [SQLserver2000] Lire un fichier pour importer des données
    Par cladsam dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 01/10/2007, 10h40

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