Alexander (HH): mehr als 407 Zeichen mit "$x->func('dbms_output_get');" lesen

Beitrag lesen

Moin Moin!

Hotti hat keinen Plan. Er frickelt auf Anfängerniveau mit Perl herum und hält sich für den Oberexperten.

Ich hab das von hier: "http://search.cpan.org/~pythian/DBD-Oracle-1.23/Oracle.pm#plsql_errstr". Im "Example" steht eben

$dbh->{RaiseError} = 1;


>   
> Wenn die das schon nicht richtig machen, wer dann?  
  
<erbsenzähler>Die [DBI](http://search.cpan.org/perldoc?DBI)-Autoren.</erbsenzähler>  
  
Es ist richtig.  
  
Es gibt im Grunde zwei unterschiedliche Varianten, das [RaiseError](http://search.cpan.org/~timb/DBI-1.616/DBI.pm#RaiseError)-Attribut zu setzen.  
  
Entweder als Attribut-Hash-Argument für die [connect](http://search.cpan.org/~timb/DBI-1.616/DBI.pm#connect)-Methode bzw. die [connect_cached](http://search.cpan.org/~timb/DBI-1.616/DBI.pm#connect_cached)-Methode:  
  
`my $dbh=DBI->connect(...,...,...,{ RaiseError => 1, ... });`{:.language-perl}  
  
Oder indem Du das Attribut direkt setzt:  
  
`$dbh->{'RaiseError'}=1;`{:.language-perl}  
  
Der feine Unterschied ist, dass die erste Variante schon während des connect() wirkt, d.h. ein fehlgeschlagenes connect() löst eine Exception aus. Die zweite Variante wirkt natürlich erst ab der Zuweisung, sollte connect() fehlschlagen, ist $dbh einfach nicht definiert (undef). Das führt dazu, dass Code à la `$dbh->{'SomeAttribute'}=SomeValue`{:.language-perl} bzw. `$dbh->someMethod(...)`{:.language-perl} "viel" später auf die Nase fällt ("Can't call method "someMethod" on an undefined value" bzw. "Can't use an undefined value as a HASH reference"). Daher ist die erste Variante zu bevorzugen.  
  
Übrigens ist RaiseError eines der Attribute, die man für alle DBI-Handle-Typen setzen kann. Typischerweise setzt man es für den Datenbank-Handle und DBI vererbt das Attribut an die Statement-Handles, aber man kann das Attribut auch manuell für ein Statement-Handle setzen. (Mir fällt nur gerade nicht ein, warum man das machen wollen würde.)  
  
  
Alexander

-- 
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".