[PERL] récupérer un flux ouvert

[Résolu/Fermé]
Signaler
-
 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.

8 réponses

Messages postés
18262
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
22 septembre 2021
5 375
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 42674 internautes nous ont dit merci ce mois-ci

Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 554
exactement :-)
ok merci! je vais essayer ça.
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.
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
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 554
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 42674 internautes nous ont dit merci ce mois-ci

Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 554
Salut,

affiche ton script
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!
Messages postés
18262
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
22 septembre 2021
5 375
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
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 554
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);

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
ok merci nikel, c'est exactement ce qu'il me fallait. Merci à vous 2.
Donc pour ceux qui seraient intéressés:
http://www.journaldunet.com/developpeur/tutoriel/cgi/030127perl_dbi1a.shtml