Problem mit prepared statement unter PHP-Database-Objekts

Hallo,

ich brauch mal wieder Eure Hilfe.

Ich habe einen Insert-Befehl mit 7 Feldern, von denen der Inhalt von drei Feldern durch (umfangreiche) Subqueries berechnet werden soll. Dabei bekomme ich, wenn ich mit prepared Statement den Befehl aus PHP aufrufe die Fehlermeldung:

“2010-10-07 12:51:04 CEST ERROR: could not determine data type of parameter $5”

Selbstverständlich läuft der Befehl - mit konkreten Daten - in pgadmin.
Der (Anfang) des Befehls, wie er im Logfile angezeigt wird, lautet:

insert into verbrauch (bemerkung, wert, ablesedatum, gebaeude, interval, differenz, verbrauch)values ($1, $2, $3, $4,
$3 - (select ablesedatum – Berechnung von “interval”

Wenn ich die Fehlermeldung richtig verstehe, sollte der 5. Parameter das Feld “interval” sein, und der Wert in der Zeile, die mit $3 beginnt berechnet werden.
Ich habe versucht den Typ per cast auf integer festzulegen, aber das gelang mir nicht.

Wenn mehr Infos benötigt werden, kann ich die gern senden.
Vielen Dank,
Rolf

PS: PostgreSQL 8.3, Debian-Lenny

Kannst Du bitte die EXAKTE Fehlermeldung zeigen, dazu vielleicht noch die Tabellendefinition(en)?

Andreas

Hallo Andreas,


  1. Das ist die exakte Fehlermeldung - es folgt nur noch der SQL-Befehl, von dem ich ja den Anfang angezeigt habe.
  2. Ich glaube ich habe meinen Fehler gefunden. Sehr wahrscheinlich kommt die Subquery mit einer Fehlermeldung oder NULL als Ergebnis zurück. Dann ist mir auch klar (geworden), warum man NULL nicht casten kann, egal wohin.

Muss aber erst noch den SQL-Befehl korrekt aufbauen lassen um meine Annahme zu bestätigen.


BTW:
Habe noch eine Zusatzfrage: Sind berechnende Subqueries in einem INSERT “transaktionstechnisch” geschützt - soll heißen, sind die Tabellen/Felder solange gesperrt, bis der Insert mit den Subqueries fertig ist?

Danke und Gruß
Rolf

Ich Antworte mir mal selbst - besser gesagt für alle anderen Leser.

Es war die fehlerhafte Subquery, auf die mit o.g. Fehlermeldung reagiert wurde.
Dadurch, dass ich die Frage hier formulieren musste, ist mir nach und nach immer klarer geworden, wo mein Problem lag.

Nochmals Danke
Rolf