Newsgroup: it.comp.lang.perl
Titolo: dbi connect e uscita errata durante un ciclo

Buona...notte a tutti :)
Ho nuovamente un problema con un dbi connect su oracle (su per giù
quello di un anno fa...ma non ne esco)
Ho una serie di stringhe di connessione per differenti db (su rhel
linux e oracle 10g), devo effettuare delle operazioni su tutti questi
database e ritornare uno status "globale".
Se tutti i database sono attivi non ho problemi con il codice
sottostante...se UN solo database nel mezzo è in uno stato
"strano" (si connette ma genera un errore), allora anche tutti i
successivi generano errore.
Se non inserisco l'eval lo script muore su un die del modulo
dbd::oracle alla riga del login (nel modulo esterno non nel mio
codice).
Sembra...ma oramai non sono più sicuro...che quando va in errore non
esegue più il login sugli altri database e considera l'errore valido
anche per gli altri database...uff....
suggerimenti? (Considerate che il codice non è copia-incolla ma è
preso da quello che mi ricordo)
foreach $string(@stringa) {
   eval {
      $Dbh = DBI->connect("DBI:Oracle:$string", "$DB_USER",
"$DB_PASSWORD",
      {
          RaiseError => 0,
          PrintError => 1
     });
   }
   if ($Dbh) {
      print "tutto ok\n";
   } else {
      print "errore\n";
   }
}

 suggerimenti?
"my $dbh" *all'interno* del ciclo.
E, in generale, "use strict".

 }
Altra cosa importante: se usi eval, (subito) dopo dovresti testare $@, 
non $dbh.
P.S.
$dbh meglio tutto minuscolo.

 se usi eval, (subito) dopo dovresti testare $@, non $dbh.
Originariamente era così...peccato che non risolveva il problema,
cambiando
con il test su $dbh il risultato era praticamente identico..

 E, in generale, "use strict".
Lo strict e il "use warnings" lo utilizzo sempre.
Per quanto riguarda l'utilizzo, avevo preferito tenerlo esterno dato
che viene
utilizzato da ulteriori subroutine richiamate da quella principale (di
cui ho
postato un pezzo)

 con il test su $dbh il risultato era praticamente identico..
Che si tratti o no della causa del tuo problema, non ha alcun senso 
adottare pratiche del tutto sbagliate.
Se DBI->connect genera un errore, $Dbh potrebbe non venire valorizzato, 
quindi � del tutto illogico testarne il valore.
E d'altro canto, visto che non lo reinizializzi ($dbh) ad ogni 
iterazione, potrebbe conservare il valore dell'iterazione precedente.
Per iniziare ad indagare su un problema, il codice da analizzare 
dovrebbe essere scritto in maniera corretta, o perlomeno non con i piedi.
Non essendo questo il caso, passo la mano a qualcuno che abbia voglia di 
cimentarsi con l'abc del Perl (anzi, della programmazione).
Un saluto.

 cimentarsi con l'abc delPerl(anzi, della programmazione).
Non essere così drastico :-)
Alla fine ho capito dov'era il problema, nel modulo DBD-Oracle, la
versione 1.22 era buggata,
aggiornando alla 1.24 il problema non è più presente, ed era proprio
dovuto all'inizializzazione
di una variabile, a quanto pare non sono l'unico a fare certi errori..
Buona giornata

 di una variabile, a quanto pare non sono l'unico a fare certi errori..
Ma almeno li correggono, come vedi ;-)
Ciao.

On 15 Feb, 14:55, Emanuele Zeppieri
<ema...@tiscali.itsnip_here.invalid> wrote:

Più che altro mi stupisce che l'esempio funzioni, visto che la graffa
del blocco eval non è seguita da un punto-e-virgola - io di solito
aggancio la gestione dell'errore al valore restituito da eval.
Ciao,
   Flavio.

 aggancio la gestione dell'errore al valore restituito da eval.
Senz'altro preferibile.
Lo faccio anche io (oppure uso Try::Tiny), ma per scopi didattici � meno 
semplice ed � in ogni caso opportuno illustrare prima la semantica di $@ 
(almeno credo ;-)
Ciao!