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

Oracle Discussion :

[pl/sql] Récupérer des données dans fichier


Sujet :

Oracle

  1. #1
    Membre habitué
    Inscrit en
    Décembre 2005
    Messages
    455
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 455
    Points : 166
    Points
    166
    Par défaut [pl/sql] Récupérer des données dans fichier
    Bonjour,

    j'ai la procédure suivante:

    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
     
    PROCEDURE recup_web IS
       ADRESSE VARCHAR2(255);
       LA_PAGE UTL_HTTP.HTML_PIECES;
       DEBUT NUMBER;
       FIN NUMBER;
       TRAVAIL VARCHAR2(4000);
       LIGNE VARCHAR2(2000);
       TYPE_FICHIER VARCHAR2(10);
       FICHIER UTL_FILE.FILE_TYPE;
       YDDD VARCHAR2(4);
       W_ROOT VARCHAR2(50);
    BEGIN
       W_ROOT :='/home/';
       SELECT TO_CHAR(SYSDATE,'YDDD') INTO YDDD FROM dual;
       ADRESSE:='http://www.toto.fr/questions/flux/questionnaire2.php4';
       LA_PAGE := UTL_HTTP.REQUEST_PIECES(ADRESSE);
       FICHIER:=UTL_FILE.FOPEN(W_ROOT,'QUEST_WEB'||YDDD||'.TXT','w');
         IF LA_PAGE.COUNT=1 
       THEN
                DEBUT:=1;
    		FIN:=0;
    		DEBUT:=INSTR(LA_PAGE(1),'<debut ',DEBUT);
    		WHILE debut<>0 LOOP
    		   FIN:=INSTR(LA_PAGE(1),'</fin>',DEBUT);
    		   LIGNE:=SUBSTR(LA_PAGE(1),debut+11,FIN-(DEBUT+11));
    		  TYPE_FICHIER:=SUBSTR(LA_PAGE(1),debut+7,3);
    		  IF TYPE_FICHIER='que' 
    		  	 THEN UTL_FILE.PUT_LINE(FICHIER,LIGNE); 
    		  END IF;
    		  DEBUT:=INSTR(LA_PAGE(1),'<debut ',FIN);
    		END LOOP;
       ELSE
    	   FOR I IN 1 .. LA_PAGE.COUNT-1
    	   LOOP
    	    TRAVAIL:= LA_PAGE(I) || LA_PAGE(I+1);
    	    DEBUT:=1;
    		FIN:=0;
    		DEBUT:=INSTR(TRAVAIL,'<debut ',DEBUT);
    		WHILE debut<>0 AND ((debut<2000 AND i< LA_PAGE.COUNT-1) OR i= LA_PAGE.COUNT-1) LOOP
    		  FIN:=INSTR(TRAVAIL,'</fin>',DEBUT);
    		  LIGNE:=SUBSTR(TRAVAIL,debut+11,FIN-(DEBUT+11));
    		  TYPE_FICHIER:=SUBSTR(LA_PAGE(i),debut+7,3);
    		  IF TYPE_FICHIER='que' 
    		  	 THEN UTL_FILE.PUT_LINE(FICHIER,LIGNE); 
    		  END IF;
    		  DEBUT:=INSTR(TRAVAIL,'<debut ',FIN);
    		END LOOP;
    	   END LOOP;
       END IF;
       	   UTL_FILE.FCLOSE(FICHIER);
       COMMIT;  
       END recup;
    Cette procédure permet de récupérer des informations via une page php qui génère des lignes, lignes correspondant à des données d'une base mysql .
    Voici à quoi ressemble le fichier que j'obtiens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <debut que>0210125834510072006BB B21     V   D  E  F  GQ1 R I     BC  FB        M  N J                               00060DEAB</fin>
    <debut que>0210135024010072006DC B31      C               R I            ABC EFB        M                                    00100DEBB</fin>
    <debut que>0210138154510072006DDAB21      C               R I  J  z.Zt. bei           A C   B       H       Fit for Fan                   00050ECAB</fin>
    <debut que>0210031282110072006DD B42     V   D              I                  C  FA            E                                00050DBBB</fin>
    Mais à chaque fois je ne récupère pas toutes les données de base de données mysql.
    il me manque 3 4 lignes. Je pense que cela vient de ma procédure PL/SQL car quand je vais directement sur ma page PHP, je recupère bien toutes mes données.

    Cela fait plusieurs temps que j'essaye de voir d'où cela peut venir mais je ne trouve pas.
    Si quelqu'un pouvait m'aider ce serait très sympa.

  2. #2
    Membre habitué
    Inscrit en
    Décembre 2005
    Messages
    455
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 455
    Points : 166
    Points
    166
    Par défaut
    Apparemment, il ne prendrait pasla prmière lignes et les dernières lignes.
    Peut être y a t'il un problème avec mes variables?

  3. #3
    Membre habitué
    Inscrit en
    Décembre 2005
    Messages
    455
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 455
    Points : 166
    Points
    166
    Par défaut
    Cette procédure s'excute la nuit...
    je n'ai aucune donnée qui a été inséré dans le fichier QUEST.
    Pourtant j'ai des données dans ma base.
    Je ne comprends pas...

  4. #4
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Il faut utiliser des traces pour comprendre. notament votre système de boucle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    FOR I IN 1 .. LA_PAGE.COUNT-1
     
      WHILE debut<>0 AND ((debut<2000 AND i< LA_PAGE.COUNT-1) OR i= LA_PAGE.COUNT-1) LOOP
     
        IF TYPE_FICHIER='que' 
    		  	 THEN UTL_FILE.PUT_LINE(FICHIER,LIGNE);
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  5. #5
    Membre habitué
    Inscrit en
    Décembre 2005
    Messages
    455
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 455
    Points : 166
    Points
    166
    Par défaut
    Citation Envoyé par SheikYerbouti
    Il faut utiliser des traces pour comprendre. notament votre système de boucle.
    Comment utilise t'on les traces?
    Hier j'ai parsemé ma procédure de DBMS_OUTPUT.PUT_LINE pour voir ce qu'elle faisait...
    Mais le sysètème de traces est peut être plus pratique?
    Cependant je ne l'ai jamais utilisé.

  6. #6
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Oui, c'est ça. en parlant de trace je parlais effectivement de DBMS_OUTPUT.
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  7. #7
    Membre habitué
    Inscrit en
    Décembre 2005
    Messages
    455
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 455
    Points : 166
    Points
    166
    Par défaut
    Hier quand j'ai fait ça, ma procédure fonctionnait très bien.
    Mais quand elle se lance la nuit elle ne me ramène aucune donnée ou quelques unes.

  8. #8
    Membre habitué
    Inscrit en
    Décembre 2005
    Messages
    455
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 455
    Points : 166
    Points
    166
    Par défaut
    Non en fait elle ne fonctionne qu'une fois sur 2.
    Cette procédure a été créé par un collègue mais il n'est plus là donc je dois résoudre le problème.
    Un vrai casse tête pour comprendre ce qu'il a fait.

  9. #9
    Membre habitué
    Inscrit en
    Décembre 2005
    Messages
    455
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 455
    Points : 166
    Points
    166
    Par défaut
    Ok j'ai replcé des traces.
    Et apparemment pour les derniers enregistrements il n'arrive pas à trouver le type fichier.
    il est à vide. de ce fait, il n'enregistre rien dans le fichier.
    Je vais essayer de comprendre pourquoi.

  10. #10
    Membre habitué
    Inscrit en
    Décembre 2005
    Messages
    455
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 455
    Points : 166
    Points
    166
    Par défaut
    J'ai un doute sur cette procédure.
    Je viens de remarquer qu'on incrémente jamais I..donc la condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHILE debut<>0 AND ((debut<2000 AND i< LA_PAGE.COUNT-1) OR i= LA_PAGE.COUNT-1) LOOP
    ne sera jamais verifié...
    il faudrait peut être changé cette condition..
    Quelqu'un peut il me donner son avi?

  11. #11
    Membre habitué
    Inscrit en
    Décembre 2005
    Messages
    455
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 455
    Points : 166
    Points
    166
    Par défaut
    je pense que je peux changer la boucle commen cela:
    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
     
     FOR I IN 1 .. LA_PAGE.COUNT-1
      LOOP
       TRAVAIL:= LA_PAGE(I) || LA_PAGE(I+1);
        DEBUT:=1;
       FIN:=0;
       DEBUT:=INSTR(TRAVAIL,'<debut ',DEBUT);
      WHILE debut<>0 LOOP
      FIN:=INSTR(TRAVAIL,'</fin>',DEBUT);
      LIGNE:=SUBSTR(TRAVAIL,debut+11,FIN-(DEBUT+11));
      TYPE_FICHIER:=SUBSTR(TRAVAIL,debut+7,3);
      IF TYPE_FICHIER='que' 
       THEN UTL_FILE.PUT_LINE(FICHIER,LIGNE); 
      END IF;
      DEBUT:=INSTR(TRAVAIL,'<debut ',FIN);
    END LOOP;
      I:=I+1;
    	   END LOOP
    donc je n'ai plus que un seul test dans ma boulce et j'incrémente mon I quand je sors de ma boucle.
    Etes vous d'accord?
    Je pense que cela fonctionnera mieux comme cela

  12. #12
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Citation Envoyé par claralavraie
    J'ai un doute sur cette procédure.
    Je viens de remarquer qu'on incrémente jamais I..donc la condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHILE debut<>0 AND ((debut<2000 AND i< LA_PAGE.COUNT-1) OR i= LA_PAGE.COUNT-1) LOOP
    ne sera jamais verifié...
    mais si !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FOR I IN 1 .. LA_PAGE.COUNT-1
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  13. #13
    Membre actif Avatar de Nounoursonne
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 264
    Points : 208
    Points
    208
    Par défaut
    je ne comprends pas l'utilité du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TRAVAIL:= LA_PAGE(I) || LA_PAGE(I+1);
    sinon tu n'as pas besoin d'incrémenter le I, il s'incrémente implicitement dans le FOR

  14. #14
    Membre habitué
    Inscrit en
    Décembre 2005
    Messages
    455
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 455
    Points : 166
    Points
    166
    Par défaut
    Excat je n'ai pas besoin de l'incrémenter ;-)

    Donc hier j'ai essayé la procédure.
    Elle m'a bien ramené enregistrés tous les enregistrements.
    Cette nuit je pensais donc que la procédure allait fonctionner correctement.
    Et non aucun enregistrement dans mon fichier alors que dans ma base MY_SQL j'en aavais.
    De plus dans la base MY SQL j'ai ajouté un champ date qui permet de savoir si l'enregistrement a bient été envoyé.
    ces dates ont été mises à jour Donc cela veut dire que la procédure a fonctionné.
    Mais pourquoi ne me ramène telle aucune rows?
    Quelqu'un peut il m'orienter vers une solution?
    Merci.

  15. #15
    Membre actif Avatar de Nounoursonne
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 264
    Points : 208
    Points
    208
    Par défaut
    est ce que le fichier est crée ?

  16. #16
    Membre habitué
    Inscrit en
    Décembre 2005
    Messages
    455
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 455
    Points : 166
    Points
    166
    Par défaut
    Oui ce fichier est créé.
    mais aucune ligne dedans.
    Est il possible qu'il n'arrive pas à accéder à l'adresse indiqué?
    Mais dans ce cas j'aurais une erreur non?

  17. #17
    Membre actif Avatar de Nounoursonne
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 264
    Points : 208
    Points
    208
    Par défaut
    c'est un job qui lance la procédure ?
    ce job n'est pas en erreur ?

  18. #18
    Membre habitué
    Inscrit en
    Décembre 2005
    Messages
    455
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 455
    Points : 166
    Points
    166
    Par défaut
    non non aucune erreur.....
    j'ai un fichier de log qui m'indique que la procédure a bien été excecutée.

  19. #19
    Membre actif Avatar de Nounoursonne
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 264
    Points : 208
    Points
    208
    Par défaut
    est tu sure de pouvoir acceder au dit site à l'heure où tu lances la procédure ?
    parce que là je ne vois pas d'erreur apparente...

  20. #20
    Membre habitué
    Inscrit en
    Décembre 2005
    Messages
    455
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 455
    Points : 166
    Points
    166
    Par défaut
    C'est ce que je me demande aussi.
    Mais si je n'arrive pas à y accéder, il ne me mettrai pas une erreur justement?

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/06/2008, 10h52
  2. Réponses: 1
    Dernier message: 19/04/2008, 16h26
  3. Réponses: 1
    Dernier message: 05/09/2006, 17h56
  4. récupérer des données dans un fichier
    Par pymouse dans le forum Langage
    Réponses: 7
    Dernier message: 19/06/2006, 17h43
  5. Réponses: 2
    Dernier message: 16/01/2006, 19h34

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