[PERL] récupérer un flux ouvert
Résolu
ranskas
-
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.
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.
A voir également:
- [PERL] récupérer un flux ouvert
- Comment recuperer un message supprimé sur whatsapp - Guide
- Cette action ne peut pas être réalisée car le fichier est ouvert dans system - Guide
- Comment récupérer un compte facebook piraté - Guide
- Récupérer mon compte facebook désactivé - Guide
- Comment récupérer un document dans le presse-papier samsung - Guide
8 réponses
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
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
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.
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.
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!
_______________________________________
#!/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!
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
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
Salut,
et pourquoi ne fait tu comme ça
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
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
Donc pour ceux qui seraient intéressés:
http://www.journaldunet.com/developpeur/tutoriel/cgi/030127perl_dbi1a.shtml
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.
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