Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi StoredProcedure Ergebnis (ZEOS/Firebird) (https://www.delphipraxis.net/37456-storedprocedure-ergebnis-zeos-firebird.html)

susa71 6. Jan 2005 01:23


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:
CREATE PROCEDURE P_GET_NEWHP_ID
RETURNS (NewID INTEGER)
AS
BEGIN
  NewID = GEN_ID(GEN_REC_HALTEPUNKTE_ID,1);
END ^
In Delphi (7 Prof.) rufe ich diese dann auf:

Delphi-Quellcode:
  with DM.ZStoredProcHpID do
  begin
    StoredProcName:='P_GET_NEWHP_ID';
    Open;
    //FHpNr:=FieldByName('NewID').AsInteger;
    FHpNr:=Params.ParamByName('NEWID').AsInteger;
  end;
Leider gelange ich aber nicht an den RETURN-Wert, er bleibt immer leer :cry:

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

Marcel Gascoyne 6. Jan 2005 06:44

Re: StoredProcedure Ergebnis (ZEOS/Firebird)
 
Zitat:

Zitat von susa71
SQL-Code:
CREATE PROCEDURE P_GET_NEWHP_ID
RETURNS (NewID INTEGER)
AS
BEGIN
  NewID = GEN_ID(GEN_REC_HALTEPUNKTE_ID,1);
  suspend;
END ^

Hier fehlte das Schlüsselwort suspend um Dein Ergebnis auch zurückzuliefern.

Zitat:

Zitat von susa71
Delphi-Quellcode:
  with DM.ZStoredProcHpID do
  begin
    StoredProcName:='P_GET_NEWHP_ID';
    Open;
    FHpNr:=FieldByName('NewID').AsInteger;
  end;

Auf die Ergebnisse der Datenmenge greift man immer mit FieldByName zu, mit ParamByName werden nur die Parameter vor dem Aufruf festgelegt.

Gruß,
Marcel

susa71 6. Jan 2005 14:40

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

urs.liska 6. Jan 2005 22:06

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:
SELECT NewID FROM p_get_newhp_id
(und evtl. WHERE, ORDER BY etc.).
In einer solchen Procedure ruft man für jeden zurückzugebenden Datensatz SUSPEND auf, etwa so:
SQL-Code:
FOR
  SELECT SpA, SpB, SpC
    FROM Tabelle
    INTO :A, B:, :C
  DO
  SUSPEND
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
SQL-Code:
EXECUTE PROCEDURE p_get_newhp_id RETURNING_VALUES :ergebnis
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.
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

susa71 9. Jan 2005 16:00

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...

urs.liska 9. Jan 2005 18:28

Re: StoredProcedure Ergebnis (ZEOS/Firebird)
 
Zitat:

Zitat von susa71
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:

Hallo Susanne.
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:
EXECUTE PROCEDURE P_GET_NEWHP_ID_VAR RETURNING_VALUES :NEWID
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).

Viel Glück, vielleicht findet sich ja noch jemand im Forum, der sich mit ZEOS auskennt?

MfG
Urs

susa71 9. Jan 2005 19:07

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 10:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz