![]() |
StoredProcedure Ergebnis (ZEOS/Firebird)
Hallo,
bin normalerweise eher Forum-Leserin als Posterin, aber bevor ich noch ganz verrückt werde... Also: Ich habe in meiner FB-DB folgende Procedure definiert, um einen Generatorwert zu setzen und dann (vor allem!) diesen Wert zu erhalten:
SQL-Code:
In Delphi (7 Prof.) rufe ich diese dann auf:
CREATE PROCEDURE P_GET_NEWHP_ID
RETURNS (NewID INTEGER) AS BEGIN NewID = GEN_ID(GEN_REC_HALTEPUNKTE_ID,1); END ^
Delphi-Quellcode:
Leider gelange ich aber nicht an den RETURN-Wert, er bleibt immer leer :cry:
with DM.ZStoredProcHpID do
begin StoredProcName:='P_GET_NEWHP_ID'; Open; //FHpNr:=FieldByName('NewID').AsInteger; FHpNr:=Params.ParamByName('NEWID').AsInteger; end; Auch im (testweise) zugeordneten DBGrid nicht: die Überschrift 'NEWID' wird angezeigt, aber KEIN Wert. Lediglich mittels IBExpert konnte ich festellen, dass der Generatorwert jedesmal fleißig erhöht wurde... Wie komme ich nur an meinen Wert? Besten Dank schon mal Susanne |
Re: StoredProcedure Ergebnis (ZEOS/Firebird)
Zitat:
Zitat:
Gruß, Marcel |
Re: StoredProcedure Ergebnis (ZEOS/Firebird)
Hallo Marcel,
besten Dank für den Hinweis - das fehlende "Suspend" wars - man sieht, ich bin noch Anfänger in der Datenbank-Programmierung... Ob ich allerdings auf dieses Ergebnis mit FieldByName oder mit ParamByName zugreife, scheint hier egal zu sein - ging beides! Grüße, Susanne |
Re: StoredProcedure Ergebnis (ZEOS/Firebird)
Hallo Susanne,
kenne mich mit ZEOS nicht aus, aber das mit SUSPEND ist (zumindest in der Theorie) nicht ganz so einfach. Es gibt zwei Arten von Procedures: selektierbare und ausführbare. Die selektierbaren liefern eine Ergebnismenge zurück, die einen oder mehrere Datensätze haben kann. Aufgerufen werden sie mit
SQL-Code:
(und evtl. WHERE, ORDER BY etc.).
SELECT NewID FROM p_get_newhp_id
In einer solchen Procedure ruft man für jeden zurückzugebenden Datensatz SUSPEND auf, etwa so:
SQL-Code:
Die ausführbaren Datensätze geben keine Datenmenge zurück, sondern entweder die Rückgabeparameter oder gar nichts (z.B. bei einer Insert-Prozedur). Aufgerufen werden sie mit
FOR
SELECT SpA, SpB, SpC FROM Tabelle INTO :A, B:, :C DO SUSPEND
SQL-Code:
Die Generator-Prozedur ist eigentlich eine ausführbare, daher solltest Du eigentlich nicht die Prozedur ändern (die war so in Ordnung, wie Du sie zuerst gepostet hast), sondern den Zugriff über die Komponente.
EXECUTE PROCEDURE p_get_newhp_id RETURNING_VALUES :ergebnis
Wahrscheinlich (wie gesagt, ich kenne mich nicht mit ZEOS aus) solltest Du nicht "Open" verwenden, da dies vielleicht versucht, die Prozedur über ein SELECT aufzurufen (ich denke, "Open" klingt wie eine Query- oder Tabellen-Komponente). Such mal in der Dokumentation der Komponenten nach Methoden wie "ExecProc" oder "Exec" oder so etwas, damit dürfte es klappen (dann wären die Ergebnisse wahrscheinlich auch in den Params zu finden). Wenn es mit Marcels Tip funktioniert, kannst Du es natürlich auch dabei belassen. Ich habe aber gelesen, dass man darauf achten sollte, ausführbare und selektierbare Prozeduren nicht durcheinanderzubringen (und insbesondere in ausführbaren Proz. nicht SUSPEND aufzurufen). Ich weiß nicht mehr genau, warum, vielleicht hatte es irgend etwas mit dem Verhalten im Fehlerfall zu tun oder mit Garbage Collection... MfG Urs |
Re: StoredProcedure Ergebnis (ZEOS/Firebird)
Hallo Urs,
die ZEOS-StoredProc-Komponente hat tatsächlich eine ExecProc-Methode, die aber leider scheinbar buggy ist :( - sobald sie einmal ausgeführt wurde, wird beim Disconnect eine Exception ausgelöst: "invalid statement handle". Als Workaround empfiehlt Michael Seeger in seinem Tutorial das Ausführen von StoredProcs ohne Ergebnismenge in einem TZQuery mittels ExecSQL. Das ist mir aber leider auch nicht gelungen: hierbei bin ich beim Ausführen von 'EXECUTE PROCEDURE P_GET_NEWHP_ID_VAR :NEWID' über ein "parameter mismatch" nicht hinaus gekommen... :cry: Ich habs nun also erstmal beim Open belassen, behalte deine Hinweise aber im Hinterkopf, bis mir mal eine korrektere Lösung über den Weg läuft! Besten Dank also nochmal für deine Mühe Susanne, die hofft, sich endlich bald auch in der Datenbank-Programmierung zuhause zu fühlen... |
Re: StoredProcedure Ergebnis (ZEOS/Firebird)
Zitat:
Da kann ich jetzt leider nicht mehr viel sagen, da ich mich - wie schon mehrfach gesagt - nicht mit den ZEOS-Komponenten auskenne (bin allerdings am überlegen, ob ich sie benutzen soll, daher auch mein Interesse an diesem Thread). Ich weiß nicht genau, was Du jetzt in der TZQuery geschrieben hast, vielleicht ist 'EXECUTE PROCEDURE P_GET_NEWHP_ID_VAR :NEWID' nur ein Tippfehler hier im Forum. Der eigentliche SQL-Aufruf müsste heißen
SQL-Code:
Es könnte auch damit zu tun haben, dass mit "StoredProcs ohne Ergebnismenge" auch solche gemeint sein könnten, die überhaupt nichts zurückgeben (z.B. INSERT-Anweisungen).
EXECUTE PROCEDURE P_GET_NEWHP_ID_VAR RETURNING_VALUES :NEWID
Viel Glück, vielleicht findet sich ja noch jemand im Forum, der sich mit ZEOS auskennt? MfG Urs |
Re: StoredProcedure Ergebnis (ZEOS/Firebird)
Hallo Urs,
das war in der Tat kein Tippfehler nur hier im Forum, sondern auch im Code... :oops: Leider hatte der erneute Versuch noch immer nicht mit den gewünschten Erfolg: 2005-01-09 19:56:33 cat: Execute, proto: firebird-1.5, msg: Dynamic SQL Error SQL error code = -104 Token unknown - line 1, char 38 RETURNING_VALUES, errcode: -104, error: Invalid token The SQL: EXECUTE PROCEDURE P_GET_NEWHP_ID_VAR RETURNING_VALUES ?; Beste Grüße Susanne, die sich langsam fragt, ob sie nur zu blöd ist... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz