$dbh->prepare(INSERT_DATA) ausgeben???
heike
- perl
0 Klaus Mock0 heike0 Eternius0 Klaus Mock0 Richard Voß
hallo zusammen!
ich möchte mir in meinem perl code das statement, dass ich mir mit der prepate methode gebastelt habe, ausgeben lassen.
hier wird das statement ausgeführt, wobei INSERT_DATA einfach der querystring als konstante ist:
$sth = $dbh->prepare(INSERT_DATA);
nun möchte ich mir den fertigen query ausgeben lassen, etwa hiermit:
print STDERR $dbh->query;
leider gibt es in perl wohl keine methode ->query!!
weiss jemand, wie ich mir nun meinen fertigen query ausgeben kann, nachdem alle "?" ersetzt wurden???
danke, eure heike
Hallo,
leider gibt es in perl wohl keine methode ->query!!
Wieso 'leider', Perl an sich kennt den Begriff 'query' garr nicht, allenfalls unter Zuhilfename eines Moduls oder selbstgeschriebenen Codes.
weiss jemand, wie ich mir nun meinen fertigen query ausgeben kann, nachdem alle "?" ersetzt wurden???
Wenn Du das Statement meinst, mit welchem prepare aufgerufen wurde, dann lies das entsprechende Attribut des Statementhandles aus (z.B. $sth->{Statement}).
Damit bekommst Du aber nicht heraus, mit welche Werten der Bindvariablen das Statment zuletzt ausgeführt wurde, da diese Information stark treiberabhängig ist. Eigentlich solltest Du die Information gar nicht benötigen, da die aus dem Statement, das ausgeführt wird und den Daten die der execute()-Methode übergeben werden sollen, zusammengestellt werden könnten. Zumindest wenn Dein Programmdesign halbwegs vernünftig ist.
Grüße
Klaus
Hi! danke für die antwort!
du hast ja recht, es funktioniert auch alles einwandfrei, nur benötige ich eben sämtliche statements, um sie in ein logfile zu schreiben (während eine dazanbank gewartet wird).
noch ideen?
danke!
Hallo,
irgendwo müssen ja die variable für ? herkommen, da kannst du dir vor oder nach dem query eine variable ala query zusammenbasteln und die ins logfile schreiben.
gruss
Hallo,
...nur benötige ich eben sämtliche statements, um sie in ein logfile zu schreiben (während eine dazanbank gewartet wird).
Irgendwie könnte das ja so aussehen (ohne my, Fehlerhandling usw.):
$sth = $dbh->prepare($insertstatement);
while(@insertdaten = bereite_insert_daten_vor())
{
$sth->execute(@insertdaten);
schreibe_insert_daten_ins_log($insertstatement,@insertdaten);
}
Wobei ich Deinen genauen Programm-Ablauf natürlich nicht kenne;-)
Grüße
Klaus
Hi! danke für die antwort!
du hast ja recht, es funktioniert auch alles einwandfrei, nur benötige ich eben sämtliche statements, um sie in ein logfile zu schreiben (während eine dazanbank gewartet wird).
noch ideen?
Du unterliegst dem Trugschluss, dass zwangsläufig an irgendeinem Punkt ein SQL-Statement existiert, in dem alle deine Daten hart kodiert sind, das so zum Server geschickt wird.
Das trifft aber nur zu, wenn die Schnittstelle nichts besseres unterstützt, die meisten allerdings erlauben es, die Daten direkt in die Datenbank zu geben, ohne sie vorher syntaktisch in SQL einzubetten. Für ein bessers Verständnis stelle man sich vor, dass die Datenbank selbst Platzhalter im SQL-Query akzeptiert und dann die Daten einsetzt, ohne dass jemals beides direkt aufeinandertrifft.
a)
prepare: INSERT INTO foo VALUES(?,?) ---> zur Datenbank
execute: [wert1] [wert2] ---> zur Datenbank
Nur wenn der DBD das nicht kann, passiert folgendes
b)
prepare: INSERT INTO foo VALUES(?,?) ---> bleibt im $sth
execute: [wert1] [wert2] ---> werden eingebettet
INSERT INTO foo VALUES(wert1,wert2)* ---> zur Datenbank
Der mit * gekennzeichnete Ausdruck wird im Regelfall nicht erzeugt. Deswegen gibt es auch keine Möglichkeit, diesen "ausgefüllten" Ausdruck von DBI zu bekommen, denn Fall b) wird unsichtbar gekapselt und nicht mehr stattfinden, wenn eine neuere Version des DBD a) durchführen kann.
Das "ausfüllen" musst du entweder selbst machen oder das Logging verändern (wozu überhaupt komplette SQL-Queries loggen, das bläht nur auf?)