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 Procédural MySQL Discussion :

if dans requete - procedure stoké


Sujet :

SQL Procédural MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 63
    Points : 42
    Points
    42
    Par défaut if dans requete - procedure stoké
    Bonjour,
    Je dois traiter dans le cadre d'un stage de master d'information en sante des fichiers textes mensuels de plusieurs milliers de lignes.
    Ces lignes sont des suites de caractères (165) correspondant aux valeurs de variables (30 variables différentes) recuperes par le service administratif. Ces valeurs ne sont pas séparées par un quelconque caractère (blanc, ',' ou bien ';'). Ces fichiers natifs
    Les variables sont toujours les mêmes d'un mois sur l'autre mais leur position dans la chaine peut changer de place. Cela est défini par un format codé sur 3 caractères en debut de chaines. Lui est toujours à cette position.
    Je dois, entre autre, en vu, de constituer un entrepôt de données créer 2 tables depuis ces données.

    J'ai fait un script php qui tronçonne cette chaine en mettant les valeurs dans des variables et j'enregistre ds mes 2 tables mais le tps de traitement est vraiment tres tres long (plusieurs dizaine de minutes) mais la recuperation des valeurs est fiable.

    j'ai decouvert les SUBSTR() et faisant un INSERT INTO .... SELECT DISTINC.....dans mysql, j'ai considérablement accélérer le processus (quelques secondes) mais mon probleme est que cette solution ne respecte pas le format et donc je n'enregistre pas ce qu'il faut là où il faut .....

    Peut insérer des conditions IF dans une requête mysql pour que je fasse le trainement 1 ou le 2 en fonction du format ? Quelle syntaxe ?
    Y a t il une autre solution plus rapide ? plus simple ?
    Faut il passer par les procédures stockées de mysql (mais je ne sais ni les implémenter, in les appeler ni.....) ?

    (je ravaille sous windows XP, wampserver 2.0 , php 5.2.7 , phpmyadmin, mysql: 5.1.30 )

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 63
    Points : 42
    Points
    42
    Par défaut
    J'ai trouvé (enfin) ma réponse. on peut mettre des IF et même des SELECT CASE.
    Je vais donc essayer en combinant SELECT CASE, INSERT INTO , SUBSTR().

    Exprimmer mon problème m' a permi de mieux appréhender les recherhce à faire pour arriver à mon but (mais je n'y suis pas encore).

    Je ne clos pas cette discussion maintenant si certains souhaitent mes répondre entre autres sur les procédures stockées.

    Merci à vous

  3. #3
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 038
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour,

    Je ne suis pas certain d'avoir bien saisi tout le problème...
    Quand vous dites que le traitement en PHP prend plusieurs minutes, est-ce que vous insérez par une requête à la fin du traitement de chaque ligne ? Si oui, pas étonnant, parce que ça fait une connexion par ligne, alors qu'il vaudrait mieux tout insérer en une seule fois.

    Sinon, il est possible de tout insérer dans une table temporaire de MySQL, puis de traiter (éventuellement à l'aide de CASE ou de IF) dans les tables définitives par la syntaxe INSERT INTO... SELECT..., par exemple.

    Mais c'est difficile d'en dire plus avec le peu d'éléments que vous nous donnez

    ced

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 63
    Points : 42
    Points
    42
    Par défaut
    Bonjour,
    Je vais vous reproduire un extrait de mon fichier. En l'occurrence se sera une analogie pour rendre la présentation plus didactique.
    Prenons 7 variables:
    format F (3 caracteres: 3 chiffres),
    clas_diag, CD (4 caracteres: 4 lettres)
    service, S (4 caracteres: 4 chiffres)
    diag D (4 caracteres: 1 lettre, 3 chiffres)
    date_hospit DH(8 caracteres: 8 chiffres)
    diag_autre DA (4 caracteres: 1 lettre, 3 chiffres)
    nda (nombre de DA) de 0 à 99

    Ces données mes sont transmises par mon administration sous forme d'un fichier texte de type ligne avec pour notre exemple 27 caracteres au moins:


    103aaaa7101a0452009030603z003t001x012-----------------seq F CD S D DH NDA DA
    103aaaa7604b0162009010601r015--------------------------seq F CD S D DH NDA DA
    103bbbb7601c4442009020304k365l989m569o548------------seq F CD S D DH NDA DA
    10420090401ddddz054750203y525j256k987-----------------seq F DH CD D S NDA DA
    10420090410nnnnt251780300------------------------------seq F DH CD D S NDA
    10420090411hhhhl561752302t212e589----------------------seq F DH CD D S NDA DA
    Le format détermine la séquence "d'apparition" des variables. 2 formats peuvent coexister sur le même fichier (150 000 lignes voire plus).

    Je dois réaliser
    une table classification diagnostique t_CD(id, CD, nbr_service)
    une t_hospitalisation(id,Service,Diag,DatehospitH,nbrDA) et une t_da(id, Diag_autre).

    Ce que j'ai fait pour le moment en php:
    Je fais une boucle de 1 au nombre de ligne ds mon fichier
    j'identifie le format de la ligne de mon fichier, puis je fais ma premiere liste de variable avec l'index 1
    Je realise alors mon tableau des premières variable.
    Une fois ce tableau fait, je l'enregistre dans ma table en faisant une boucle de 1 à nb de ligne de mon fichier.

    Pour 10 000 ligne, php met 60 secondes environ alors pour 150 000...

    Maintenant j'essaie avec des SELECT IF. avoir la syntaxe suivante

    IF(SUBSTR(mon_champs,INSERT INTO ... tableA, INSERT INTO... tableB)

    J'espere avoir été plus clair. Je n'ai pas mis mon code car le type de fichier que je vous ai présenté est une analogie (canada dry...) à mon fichier.
    Si vous souhaitez, je peux vous le présenter.
    Cordialement.

  5. #5
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 038
    Points : 23 786
    Points
    23 786
    Par défaut
    Citation Envoyé par ratatam25 Voir le message
    Une fois ce tableau fait, je l'enregistre dans ma table en faisant une boucle de 1 à nb de ligne de mon fichier.
    Si tu insères une ligne avec une requête INSERT par ligne, pas étonnant que ça prenne autant de temps . Eventuellement, tu peux insérer plusieurs lignes d'un coup (en un seul insert) avec la syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    INSERT INTO matable (monchamp1, monchamp2, ...)
    VALUES (valeur1_1, valeur2_1, ...),
    (valeur2_1, valeur2_2, ...),
    (valeur3_1, valeur3_2, ...),
    (valeur4_1, valeur4_2, ...),
    ...
    (valeurN_1, valeurN_2, ...);
    Maintenant, il doit être possible de charger l'ensemble du fichier dans une table temporaire, puis de le traiter par requête avec une syntaxe du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO table1
    SELECT SUBSTRING(champtemporaire), SUBSTRING(champtemporaire),...
    FROM latabletemporaire
    WHERE SUBSTRING(champtemporaire, 1, 3) = '103';
    Et au lieu de faire des IF... tu fais plusieurs requêtes sur ta table temporaire dans lesquels les conditions changent selon tes besoins.

    Je ne sais pas si mon exemple est bien clair

    ced

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 63
    Points : 42
    Points
    42
    Par défaut
    Je viens de découvrir ta réponse...et je suis furieux apres moi-même de ne pas avoir eu l'idée de faire aussi simplement.
    Je n'ai pas cette requête essayé mais je suis sûr que cela va aller.
    J'essaye d'ici peu et te tiens au courant... chrono en main.
    Merci

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 63
    Points : 42
    Points
    42
    Par défaut
    De plusieurs minutes je passe à quelques fractions de secondes.
    Que n'ai je posé ma question plutôt (3 jours à chercher).
    Ce que je retiens
    1/ pdt 3 jours j'ai cherché sans trouver,
    2/ en cherchant pdt 3 jours, j'ai beaucoup appris,
    3/ qu'en exposant son pb à autrui, il devient plus clair pour soi,
    4/ que le forum est source d'information de qualité.

    Merci à toi ced d'avoir pris le temps de te pencher sur mon pb.

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

Discussions similaires

  1. Utilisation procedure pl/sql dans requete sql
    Par KNIZOU dans le forum PL/SQL
    Réponses: 20
    Dernier message: 10/04/2008, 11h36
  2. creation d une requete dynamique dans une procedure stockee
    Par oxilab dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 20/02/2008, 15h57
  3. tests sur requetes dans une procedure stockée
    Par morback dans le forum SQL
    Réponses: 18
    Dernier message: 30/08/2007, 16h36
  4. Réponses: 4
    Dernier message: 28/12/2003, 15h50
  5. [TP]code asm dans une procedure
    Par M.Dlb dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 17/08/2002, 20h43

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