[PERL] récupérer un flux ouvert

Résolu
ranskas -  
 ranskas -
Bonjour,

J'aurais voulu récupérer un flux ouvert après un traitement de données. Je m'explique: je souhaite ouvrir une connexion SQL dans mon programme perl, faire un traitement dessus et puis revenir sur la connexion SQL... Est-il possible de faire cela?

je souhaiterai optimiser mon programme car aujourd'hui, j'ouvre 2 connexions et entre les 2 je fais mon traitement mais j'aurais souhaité n'avoir qu'une seule connexion à ouvrir...

Merci pour votre aide.
Configuration: Windows XP
Firefox 2.0.0.5

8 réponses

  1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    Je dirais:

    open (FH, "| sqlplus -s user/pswd@Base 2>&1");

    tu peux écrire tes requêtes sur FH et il reste ouvert (sqlplus en exécution) tant qu'il n'y a pas de close
    1
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      exactement :-)
      0
    2. ranskas
       
      ok merci! je vais essayer ça.
      0
    3. ranskas
       
      Re,

      Je viens d'essayer ca et je crois bien que c'est la solution que je cherche. Toutefois, j'aurais encore une question (dsl je ne suis pas un pro de perl):

      donc je fais ceci:
      ___________________________________________________
      #!/usr/bin/perl

      open(FH,"|sqlplus user/pswd@base 2>&1");

      #donc ici ma connexion sur "base" est ouverte
      #Ensuite je peux donc faire ce que je veux...

      print FH "select TABLE from TOTO;";

      close(FH);

      ___________________________________________________

      Ceci marche donc bien mais le pb c'est que je souhaiterai récupérer le résultat dans une variable et pouvoir la traiter... avant le close(FH)... Mais a priori, il exécute ma requete (select ... from) seulement lorsque je ferme le descripteur. n'y a t il pas un moyen de récupérer ma requete avant le close?

      Merci d'avnce.
      0
    4. ranskas
       
      Bonjour,

      Bon je galère tjrs... En gros le flux est ouvert mais comme dit précédemment, les requêtes que je traite par la suite ne s'exécute uniquement que lors du close(FH). N'y a t il pas un moyen de le faire éxécuter avant de fermer le File Handler?

      En gors ci je fais ceci:
      _____________________________

      open(FH,"|sqlplus user/pswd@base 2>&1;");
      # ici ma connexion à ma base est ouverte
      # je souhaiterai désormais lancer des requêtes

      #requête 1:
      print FH "SELECT titi FROM toto;";

      print "Hello world!\n";

      #requête 2:
      print FH "SELECT tata FROM toto;";

      print "Pouêt!\n";

      close(FH);

      -----------------------------
      Voici le résultat que j'ai à l'écran (dans l'ordre):

      Hello world!
      Pouêt!
      #Ici j'ai le résultat de ma requête 1
      #Ici j'ai le résultat de ma requête 2

      _____________________________________________________

      En gros, on voit bien que mes 2 requêtes SQL ne s'éxécute uniquement que lors de l'appel au close(FH)... Ma question est donc: peut-on récupérer les requêtes avant d'avoir le close(FH)?

      Merci d'avance
      0
  2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,


    Si le nom de fichier commence par '|', le nom de fichier est interprété comme une commande vers laquelle seront dirigées les sorties (via un tube -- en anglais pipe) et si le nom de fichier se termine par '|', le nom de fichier est interprété comme une commande dont la sortie sera récupérée


    Je te conseille d'utiliser le module DBI, pour exploiter ta base.
    1
  3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    affiche ton script
    0
  4. ranskas
     
    salut, oui je ne l'ai pas écrit car il est des plus basic. En gros c'est cela que je fais:

    _______________________________________
    #!/usr/bin/perl

    my $command = `sqlplus -s user/pswd@Base << EOF 2>&1
    #ici je lance ma requete...
    EOF`;

    #ici je récupère ma variable $command et je fais un traitement dessus, en fonction du résultat, je rouvre une autre requete sur la même base.

    my $command2=`sqlplus -s user/pswd@Base << EOF 2>&1
    #traitement a nouveau
    EOF`;
    ________________________________________

    En gros j'ouvre 2 requêtes et entre les 2 je fais un traitement... J'aurais souhaité savoir si je pouvais ne pas fermer ma première requête (du genre la mettre en arriere plan), faire un traitement de données puis récupérer la requête ouverte...

    Toutes suggestions sont les bienvenues!
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    Hello
    utiliser open qui retourne un "file handle"
    http://www.sunsite.ualberta.ca/Documentation/Misc/perl-5.6.1/pod/perlfunc/open.html

    ensuite je peux accéder au file handle de mon choix, si j'ai ouvert plusieurs fichiers/processes
    0
  7. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    et pourquoi ne fait tu comme ça
    my $command = `sqlplus -s user/pswd@Base << EOF 2>&1 
    # ici tu lance la requête globale que tu la sauvagerde
    # dans un fichier temporaire
    # ensuite tu vas utilser un handle pour 
    # traiter les infos
    # pour faciliter il faut 
    # bien faire la rédirection vers le fichier temporaire
    # en utilisant un champ de séparation... 
    EOF`; 
    
    # ici
    open REQUETE, "$requete_tmp"
          or die "E/S : $!\n";
    
    while (<REQUETE>){
    #     traitement
    }
    
    # suppression fichier temporaire
    unlink ($requete_tmp);

    0
  8. ranskas
     
    rebonjour,

    oui j'avais effectivement penser à cette solution mais j'aurais préféré éviter d'écrire sur un fichier...Merci en tout cas pour vos idées.

    Mais en gros, n'est-il pas possible de laisser le flux ouvert et de le récupérer? car lorsque je fais mon appel à ma variable $command, je fais un appel système... ensuite je traite ... et je refais un autre appel système...

    n'y a-t-il pas un moyen de ne faire qu'un seul appel système (sans passer par la redirection vers un fichier)? Peut-être ce que je demande n'est pas possible...

    Merci d'avance
    0