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 Oracle Discussion :

[Oracle 9i] Chargements de fichiers en tables


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Inscrit en
    Juin 2003
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 156
    Points : 85
    Points
    85
    Par défaut [Oracle 9i] Chargements de fichiers en tables
    Bonjour,

    Permettez-moi de vous exposer ma problématique...

    Je dois traiter dans un batch les données provenant d'un fichier au format texte. Chaque ligne de ce fichier correspond à un type d'enregistrement identifié par un trigramme (ou équivalent car peu importe). L'idée serait de traiter ces données qui auraient été insérées dans une table oracle afin de simplifier les contrôles, les mises en forme, etc...

    Donc j'ai aussitôt pensé à SQL*Loader ou autres tables externes mais la difficulté réside dans le fait que toutes les lignes du fichier n'ont pas la même structure...

    Alors comment procéder ? Faire une table temporaire par type d'enregistrement ? Fare une table banalisée mais dans ce cas, comment prévenir les messages d'erreur du Loader ? Ou dois je me résoudre à travailler sur le fichier sans pouvoir le monter dans une table ?

    Merci d'avance,

    Frédéric

  2. #2
    Rédactrice

    Avatar de kalyparker
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Janvier 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 327
    Points : 2 998
    Points
    2 998
    Par défaut
    Sql Loader te permet de charger plusieurs tables d'un coup.
    avec la clause when

    Je m'expliques tu identifie ce qui caractérise ton enregistrement à charger dans ta table et tu décrit tes différentes tables.
    Je pense que tu peux trouver plus d'info sur le site...
    It isn't that they can't see the solution, it's that they can't see the problem.
    Mes Articles et Traductions (Microstrategy, Css et Javascript)
    Si vous souhaitez contribuer à la rubrique BI, contactez-moi ou tout autre membre de l'équipe BI par MP.

  3. #3
    Membre régulier
    Inscrit en
    Juin 2003
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 156
    Points : 85
    Points
    85
    Par défaut
    Ah oui je vois, en gros ça revient à répartir le fichier en plusieurs tables en fonction d'une clause comme la valeur d'une zone par exemple ? Je ne savais pas, c'est une très belle fonctionnalité...

    MAis je complique mon besoin désolé . Faudrait quand même que je sache relier les lignes car en fait c'est une structure d'enregistrements qui concerne un bloc de données cohérent. Si je prenais un exemple, je dirais qu'un client est décrit par :
    - nom, prénom, état civil : enreg type 1
    - adresse : enreg type 2
    - commande 1 : enreg type 3
    - commande 2 : enreg type 3
    Quel que soit l'éclatement, je dois savoir relier tout ça au client en question.

    Vous voyez ?

    Fred

  4. #4
    Rédactrice

    Avatar de kalyparker
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Janvier 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 327
    Points : 2 998
    Points
    2 998
    Par défaut
    Qu'est ce qui, actuellement, te permet de relier tes différents enregistrements ?
    L'ordre dans le fichier ?
    It isn't that they can't see the solution, it's that they can't see the problem.
    Mes Articles et Traductions (Microstrategy, Css et Javascript)
    Si vous souhaitez contribuer à la rubrique BI, contactez-moi ou tout autre membre de l'équipe BI par MP.

  5. #5
    Membre régulier
    Inscrit en
    Juin 2003
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 156
    Points : 85
    Points
    85
    Par défaut
    Oui ça revient à ça. L'enregistrement type 1 par exemple marque le début de la description du bloc de données.

  6. #6
    Rédactrice

    Avatar de kalyparker
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Janvier 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 327
    Points : 2 998
    Points
    2 998
    Par défaut
    Je crois qu'il te faux créer un ident commun.
    Une des solutions possibles serais de d'utiliser des sequences dans un trigger.
    Lorsque tu charges les données avec sqlldr les triggers sont déclenchés alors... autant en profiter
    It isn't that they can't see the solution, it's that they can't see the problem.
    Mes Articles et Traductions (Microstrategy, Css et Javascript)
    Si vous souhaitez contribuer à la rubrique BI, contactez-moi ou tout autre membre de l'équipe BI par MP.

  7. #7
    Membre régulier
    Inscrit en
    Juin 2003
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 156
    Points : 85
    Points
    85
    Par défaut
    Oui donc avoir un moyen de regrouper a posteriori les enregistrements liés entre eux. Peux-tu m'expliquer plus concrètement comment ça pourrait fonctionner avec un trigger ? MErci encore.

  8. #8
    Rédactrice

    Avatar de kalyparker
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Janvier 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 327
    Points : 2 998
    Points
    2 998
    Par défaut
    Ok, je pense que le plus simple est de créer une sequence.

    Je part du principe que les informations que tu dois stockés sont dans des tables différentes :
    - nom, prénom, état civil --> table_1
    - adresse --> table_2
    - commande 1 --> table_3

    sur la table_1 tu avance ta séquence.
    sur les autres tables tu fait simplement une consultation du numéro de la sequence (curval).
    Normalement, ça devrais marcher
    It isn't that they can't see the solution, it's that they can't see the problem.
    Mes Articles et Traductions (Microstrategy, Css et Javascript)
    Si vous souhaitez contribuer à la rubrique BI, contactez-moi ou tout autre membre de l'équipe BI par MP.

  9. #9
    Membre régulier
    Inscrit en
    Juin 2003
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 156
    Points : 85
    Points
    85
    Par défaut
    Mais je peux faire tout ça avec un SQL*Loader ?

    Excuse moi si mes questions sont un peu *newbie*

  10. #10
    Rédactrice

    Avatar de kalyparker
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Janvier 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 327
    Points : 2 998
    Points
    2 998
    Par défaut
    Mais je peux faire tout ça avec un SQL*Loader ?
    Oh là, non, sqlldr s'est faire plein de chose, mais pas tout quand même !
    Tu crée un trigger sur chaque table : table_1, table_2 et table_3.
    Ensuite lorsque tu vas lancer ton chargement, les triggers vont se lancer automatiquement lors de l'insertion des données.
    Si tu veux en savoir plus sur l'utilisation de sqlldr :
    http://jaouad.developpez.com/sqlldr/

    Si tu veux en savoir plus sur l'utilisation des triggers :
    http://sheikyerbouti.developpez.com/...e=Chap6#L6.3.4

    Excuse moi si mes questions sont un peu *newbie*
    --> pas de soucis, je suis bien capable de faire pareil
    It isn't that they can't see the solution, it's that they can't see the problem.
    Mes Articles et Traductions (Microstrategy, Css et Javascript)
    Si vous souhaitez contribuer à la rubrique BI, contactez-moi ou tout autre membre de l'équipe BI par MP.

  11. #11
    Membre régulier
    Inscrit en
    Juin 2003
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 156
    Points : 85
    Points
    85
    Par défaut
    Alors ça s'éclaircit un peu, merci beaucoup l'ami

    Encore une question néanmoins, comment puis-je faire dans la création d'un trigger pour faire le lien entre l'identifiant de la table_1 généré automatiquement par la séquence et les lignes des tables_2 et table_3 qui doivent contenir cette référence ? Il y a le curval certes mais çà ne me dit pas où et comment l'utiliser tu vois ?

    Fred

  12. #12
    Rédactrice

    Avatar de kalyparker
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Janvier 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 327
    Points : 2 998
    Points
    2 998
    Par défaut
    C'est la séquence qui va te permettre de faire le lien.
    Si ta séquence s'appelle ma_sequence alors
    ma_sequence.nextval te donnera la valeur suivante.
    ma_sequence.currval te donnera la valeur en cours.

    Si tu veux en savoir plus google est ton ami
    It isn't that they can't see the solution, it's that they can't see the problem.
    Mes Articles et Traductions (Microstrategy, Css et Javascript)
    Si vous souhaitez contribuer à la rubrique BI, contactez-moi ou tout autre membre de l'équipe BI par MP.

  13. #13
    Membre régulier
    Inscrit en
    Juin 2003
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 156
    Points : 85
    Points
    85
    Par défaut
    Je vois bien comment fonctionne la séquence. Ce que je vois moins en revanche c'est comment tout ça se goupille (ou se dégoupille ) ensemble. Je veux dire le Loader, les trigger, la séquence... A quel moment glisser du code PL/SQL ??

  14. #14
    Rédactrice

    Avatar de kalyparker
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Janvier 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 327
    Points : 2 998
    Points
    2 998
    Par défaut
    Pour goupiller tout cela c'est simple (enfin façon de parler)
    Il faut que
    - les tables soient créer.
    - la sequence soit créer.
    - les triggers sur les tables (qui font appel à la séquence) soient créer.

    Ensuite lorsque tu lanceras la commande de chargement de sqlldr tout ce petit monde travaille tous seul.

    En gros, ton code pl se trouve dans les triggers.
    It isn't that they can't see the solution, it's that they can't see the problem.
    Mes Articles et Traductions (Microstrategy, Css et Javascript)
    Si vous souhaitez contribuer à la rubrique BI, contactez-moi ou tout autre membre de l'équipe BI par MP.

  15. #15
    Membre régulier
    Inscrit en
    Juin 2003
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 156
    Points : 85
    Points
    85
    Par défaut
    Ok, je vois bien la logique d'enchaînement maintenant... Merci.

    Par contre, j'imagine encore mal le code au sein des triggers, jamais eu l'occasion de faire ça. En particulier déjà, faut-il un trigger global ou un par table ? Ensuite en pseudo code, que doivent faire ce ou ces triggers ?

    Merci, Fred

  16. #16
    Rédactrice

    Avatar de kalyparker
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Janvier 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 327
    Points : 2 998
    Points
    2 998
    Par défaut
    Bon allez c'est ma dernière astuce de la journée après repos ! :

    CREATE OR REPLACE TRIGGER trigger_table_1
    BEFORE INSERT ON table_1 FOR EACH ROW
    BEGIN
    SELECT ma_sequence.NEXTVAL INTO :ident_table_1 FROM DUAL;
    END;

    pour les autres c'est tout pareil avec les petits changements qui s'impose !

    Voilou
    It isn't that they can't see the solution, it's that they can't see the problem.
    Mes Articles et Traductions (Microstrategy, Css et Javascript)
    Si vous souhaitez contribuer à la rubrique BI, contactez-moi ou tout autre membre de l'équipe BI par MP.

  17. #17
    Membre régulier Avatar de DoRiane
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 127
    Points : 110
    Points
    110
    Par défaut
    bonjour,
    Le problème avec la solution du trigger, c'est qu'on ne peut pas mettre à jour la ligne concerné par le trigger dans ce même trigger.
    Par contre tu peux faire comme expliqué à l'adresse suivante
    http://jaouad.developpez.com/sqlldr/#LV-E
    Bonne journée

  18. #18
    Rédactrice

    Avatar de kalyparker
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Janvier 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 327
    Points : 2 998
    Points
    2 998
    Par défaut
    Le problème avec la solution du trigger, c'est qu'on ne peut pas mettre à jour la ligne concerné par le trigger dans ce même trigger.
    Par contre tu peux faire comme expliqué à l'adresse suivante
    http://jaouad.developpez.com/sqlldr/#LV-E
    Je ne connaissais pas cette solution DoRiane.

    Effectivement c'est encore plus simple en utilisant directement les sequences dans sqlldr.

    +
    It isn't that they can't see the solution, it's that they can't see the problem.
    Mes Articles et Traductions (Microstrategy, Css et Javascript)
    Si vous souhaitez contribuer à la rubrique BI, contactez-moi ou tout autre membre de l'équipe BI par MP.

  19. #19
    Membre régulier
    Inscrit en
    Juin 2003
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 156
    Points : 85
    Points
    85
    Par défaut
    Ca me semble bien comme solution mais comment maintenir le lien entre les trois tables de notre exemple ? Parce que là, chaque séquence suit sa vie non ?

  20. #20
    Membre régulier Avatar de DoRiane
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 127
    Points : 110
    Points
    110
    Par défaut
    bien sur, on utilise nextval pour la table personne et curval pour les autres tables sur la même séquence.
    Bonne journée

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 17/03/2015, 09h42
  2. Chargement table Oracle à partir d'un fichier plat
    Par tonio45312 dans le forum SQL
    Réponses: 7
    Dernier message: 19/06/2008, 14h38
  3. Réponses: 1
    Dernier message: 04/03/2008, 19h24
  4. Réponses: 3
    Dernier message: 28/11/2006, 08h44
  5. [Oracle Text]Chargement de fichiers / index
    Par Kuuei dans le forum SQL
    Réponses: 2
    Dernier message: 13/05/2006, 12h46

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