Newsgroup: it.comp.lang.perl
Titolo: Query multiple su stessa tabella Oracle...

Ho un "piccolo" problema con un programmillo Perl che si interfaccia con
un DB Oracle.
Il programma in questione contiene alcune Subroutine che si connettono al
DB eseguono determinate query, elaborano il risultato e producono un
report finale.
Fino ad oggi ha funzionato abbastanza bene e senza problemi in quanto ogni
Sub attinge a una tabella diversa.
Ora č venuto fuori un problema a causa del fatto che ho due Sub che
attingono alla stessa tabella in momenti diversi e, una volta eseguita la
prima, il cursore sembra rimanere al fondo della stessa non permettendo
alla seconda di attingere ai dati incominciando dalla prima linea e dando
come risultato 0 linee.
Non so se mi sono spiegato in modo comprensibile... ma sono pronto a
spiegarlo meglio a chi se la sente di darmi una mano.
Avete qualche suggerimento per risolvere l'inghippo?
TIA
M.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 
Ciao
Io di solito quando devo usare i dati di un cursore in diversi punti,
ovvero ho bisogno di scorrerlo più volte,
leggo il cursore una prima volta,
salvando tutto su un array di array, o un array di hash.
A questo punto ho una variabile che posso passare ad ogni sub
che necessita di questi dati.
E' sufficiente quindi un banale foreach
per scorrere il contenuto di questa nuova variabile.
Francamente non so se sia il modo migliore di agire,
sia in relazione al tuo caso, che in generale.
Però sicuramente funziona.
Spero di essere stato chiaro.
bye ;-)
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.5 (GNU/Linux)
Comment: Using GnuPG with Mozilla - 
http://enigmail.mozdev.org
iD8DBQFFWY68SoG8+4FXrhYRAljnAKC+4TQq5Bmb7dQagEZN18HrKBE2hwCgg0cq
uC8pM7yQyAB2lvlM0jTSmn8=
=OasA
-----END PGP SIGNATURE-----

 ....
Tanto per capire meglio .... una cosa del genere ?
our $dbh = DBI->connect('dbi:Oracle:', 'user/pwd@istanza', '') 
	|| die "$DBI::errstr";
Sub1();
Sub2();
$dbh->disconnect;
######################################################################
sub Sub1
{
    my $sth  = $dbh->prepare(q{select pippo from nometab where 
condizione1});
    my $rc = $sth->execute;
    while ( my @ary = $sth->fetchrow_array )
    {
        #~ elaboro il cursore
    }
    $sth->finish();
}
######################################################################
sub Sub2
{
    my $sth  = $dbh->prepare(q{select pippo from nometab where 
condizione2});
    my $rc = $sth->execute;
    while ( my @ary = $sth->fetchrow_array )
    {
        #~ elaboro il cursore
    }
    $sth->finish();
}
Byez
Stefano

 Tanto per capire meglio .... una cosa del genere ?
[...cut...]
Praticamente sì, solo che nel mio caso viene realizzato con qualcosa del
tipo:
$sth = $dbh->prepare ("SELECT $Campi FROM $Table WHERE $Clause");
$sth->execute;
$rv = $sth->bind_columns(\$campo1, ..., \$campoN);,
print "campo1	...	campoN";
while ($sth->fetch) {
print "$campo1	...	$campoN";
}
$sth->finish;
ad ogni lancio delle singole Sub e solo alla fine viene effettuato il
disconnect...


 disconnect...
Mmmhhh... cosi' credo di non averci mai provato...
Vedo di fare un esperimento e poi ti faccio sapere...
Byez
Stefano

 
In teoria, se tu esegui _tutte_ le righe sopra riportate in ogni sub,
non dovresti avere il problema di cui hai parlato..
A meno che, tra la prima e la seconda esecuzione,
i record su cui stai lavorando non vengano modificati
in modo da non matchare piů la tua were condition.
In ogni caso, non mi pare il modo migliore di lavorare,
perchč cosě facendo vanifichi il prepare.
Forse sarebbe pů giusta una cosa del genere:
$sth = $dbh->prepare ("SELECT $Campi FROM $Table WHERE $Clause");
&fnc1($sth);
...
&fnc2($sth);
..
$sth->finish;
sub fnc1 {
  my $sth = shift;
  $sth->execute;
  $rv = $sth->bind_columns(\$campo1, ..., \$campoN);,
  print "campo1	...	campoN";
  while ($sth->fetch) {
  print "$campo1	...	$campoN";
}
sub fnc2 {
  my $sth = shift;
  $sth->execute;
  $rv = $sth->bind_columns(\$campo1, ..., \$campoN);,
  print "campo1	...	campoN";
  while ($sth->fetch) {
  print "$campo1	...	$campoN";
}
###############
Io invece normalmente lavoro cosě:
$sth = $dbh->prepare ("SELECT $Campi FROM $Table WHERE $Clause");
$sth->execute;
my $i = 0;
while (my $hashref=$sth->fetchrow_hashref()) {
   my @campi = keys%{$hashref};
   foreach my $col (@campi) {
       	$my_arr_hash[$i]{lc($col)}=$hashref->{$col};
       #print "$col -> $hashref->{$col}\n";
   }
   $i++;
}
a questo punto sulla variabile $my_arr_hash hai tutti i tuoi records,
e la puoi sfruttare quanto e come vuoi.
bye ;-)
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.5 (GNU/Linux)
Comment: Using GnuPG with Mozilla - 
http://enigmail.mozdev.org
iD8DBQFFWdmtSoG8+4FXrhYRAsAMAKC0DeiszWZaSfJ3ElaCCgD7kNx2IgCgtZBh
T+7si5VFZx9jckT7VwYMfPg=
=IXzk
-----END PGP SIGNATURE-----

 non dovresti avere il problema di cui hai parlato..
Concordo.
Intanto mi scuso per con M4RIO per aver portato le cose un po' alla 
lunga, ma non mi era mai capitato di usare la bind_columns e mi sono 
andato a guardare anche un po' di documentazione ...
In effetti ho fatto diverse prove, ma il problema non si e' presentato 
(ogni cursore elaborato fino alla fine).....
... a questo punto non mi viene molto in mente .... piattaforma e 
versione ???
Byez
Stefano