[PERL] récupérer un flux ouvert

Résolu/Fermé
ranskas - 14 août 2007 à 17:45
 ranskas - 17 août 2007 à 17:03
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

dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
16 août 2007 à 14:06
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
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
16 août 2007 à 14:09
exactement :-)
0
ok merci! je vais essayer ça.
0
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
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
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
17 août 2007 à 14:48
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
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
14 août 2007 à 18:59
Salut,

affiche ton script
0
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
16 août 2007 à 12:23
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
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
16 août 2007 à 12:36
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
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
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
0