2016-06-29 14 views
1

Ich habe ein Perl-Skript, das eine Anweisung mit Params 1,2,3,4 mit DBI-Schnittstelle vorbereitet. Die Prepare-Anweisung führt eine gespeicherte Prozedur mit 4 Parametern. Dann führt es eine foreach-Schleife und tut executePerl Ausführen von DBI Ausführen in Schleife

Wenn die Parameter nicht richtig sind, löst die gespeicherte Prozedur einen Fehler aus und die Ausführung schlägt fehl. Ich bin daran interessiert, eine Warnung auszudrucken und mit dem nächsten Satz von Parametern fortzufahren.

Nach dem ersten Ausführungsfehler für einen "ungültigen Parameter", bekomme ich "Versuch, eine neue Adaptive Server-Operation mit Ergebnissen anhängig zu starten" als errmsg in SQL für die nachfolgende Schleifeniteration ausführen.

foreach my $file (@filelist) 
{ 
    #.. get param1 , param2 , param3, param4 from $file 
    unless (dbh->execute($param1,$param2,$param3,$param4)) 
    { 
     #print some warning 
     next; 
    } 
} 

Wie kann ich die Verarbeitung mit diesem Fehler fortsetzen?

Dies sind die Version I

bin mit
>perl -MDBI -e 'DBI-> installed_versions;' 
     Perl   : 5.010001 (x86_64-linux-thread-multi) 
     OS    : linux  (2.6.18-348.12.1.el5) 
     DBI    : 1.609 
     DBD::Sybase  : 1.15 
     DBD::Sponge  : 12.010002 
     DBD::SQLite  : 1.27 
     DBD::Proxy  : install_driver(Proxy) failed: Can't locate RPC/PlClient.pm in @INC 
     DBD::Informix : 2013.0521 
     DBD::Gofer  : 0.011565 
     DBD::File  : 0.37 
     DBD::ExampleP : 12.010007 
     DBD::DBM  : 0.03 

I { RaiseError => 0, PrintWarn => 1, PrintError => 1 } in der Verbindungs ​​hinzugefügt, wie durch mekazu vorgeschlagen, (Der Code ist genau die gleiche wie bei Sie zu), aber es ist immer noch nicht helfen, den gleichen Fehler.

In foreach bekomme ich Erfolg, Iteration 1 kein Fehler

Iteration 2 gibt einen gespeicherten Prozedur Fehler

" Database execute failed. ERROR MESSAGE: Server message number=52001 severity=16 state=1 line=124 server=dev procedure=sp1 text=Data Error:Invalid parameter: P1

Iteration 3

Database execute failed. ERROR MESSAGE: OpenClient message: LAYER = (0) ORIGIN = (0) SEVERITY = (78) NUMBER = (51) Server dev, database dev Message String: Attempt to initiate a new Adaptive Server operation with results pending

Iteration 4

Database execute failed. ERROR MESSAGE: OpenClient message: LAYER = (0) ORIGIN = (0) SEVERITY = (78) NUMBER = (51) Server dev, database dev Message String: Attempt to initiate a new Adaptive Server operation with results pending

+2

Haben Sie versucht, Ihre '$ dbh-> ausführen, um zu sorround ($ p1, p2 $ $ p3" , $ p4) 'mit' eval {$ dbh-> execute (...);} oder mache {#print irgendeine Warnung; next;} '? – Otterbein

+0

Ich erhalte denselben Fehler - Datenbankausführung fehlgeschlagen. FEHLERMELDUNG: OpenClient-Nachricht : LAYER = (0) ORIGIN = (0) SEVERITY = (78) NUMBER = (51) Server dev, Datenbankentwickler Nachrichtenzeichenfolge: Versuch, eine neue Adaptive Server-Operation mit ausstehenden Ergebnissen einzuleiten – Sree

+0

So beheben Sie diesen Fehler I Es ist unklar, ob das DBI oder SQL-Fehler ist – Sree

Antwort

0

Stellen Sie sicher, dass Sie RaiseError (Standard: false) deaktivieren, wenn Sie das Handle erstellen. und PrintError (Standard: true): Sie können PrintWarn (false Standard) verwenden, um Sie es selbst zu tun sparen:

$dbh = DBI->connect($dsn, $user, $password, 
       { RaiseError => 0, PrintWarn => 1, PrintError => 1 }); 
my $sth = $dbh->prepare($query); 
foreach my $file (@filelist) 
{ 
    #.. get param1 , param2 , param3, param4 from $file 
    unless ($sth->execute($param1,$param2,$param3,$param4)) 
    { 
     #warning already printed 
     next; 
    } 
}