AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi StoredProcedure Ergebnis (ZEOS/Firebird)
Thema durchsuchen
Ansicht
Themen-Optionen

StoredProcedure Ergebnis (ZEOS/Firebird)

Ein Thema von susa71 · begonnen am 6. Jan 2005 · letzter Beitrag vom 9. Jan 2005
Antwort Antwort
susa71

Registriert seit: 9. Dez 2004
Ort: Hamburg
5 Beiträge
 
Delphi 7 Professional
 
#1

StoredProcedure Ergebnis (ZEOS/Firebird)

  Alt 6. Jan 2005, 01:23
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

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
  Mit Zitat antworten Zitat
Benutzerbild von Marcel Gascoyne
Marcel Gascoyne

Registriert seit: 18. Nov 2003
Ort: Uetersen
271 Beiträge
 
Delphi 2005 Architect
 
#2

Re: StoredProcedure Ergebnis (ZEOS/Firebird)

  Alt 6. Jan 2005, 06:44
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 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
Marcel Gascoyne
Der Fehler sitzt immer vor der Tastatur
  Mit Zitat antworten Zitat
susa71

Registriert seit: 9. Dez 2004
Ort: Hamburg
5 Beiträge
 
Delphi 7 Professional
 
#3

Re: StoredProcedure Ergebnis (ZEOS/Firebird)

  Alt 6. Jan 2005, 14:40
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
  Mit Zitat antworten Zitat
urs.liska

Registriert seit: 6. Aug 2003
Ort: Freiburg
195 Beiträge
 
Delphi 6 Professional
 
#4

Re: StoredProcedure Ergebnis (ZEOS/Firebird)

  Alt 6. Jan 2005, 22:06
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 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 mitEXECUTE 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
  Mit Zitat antworten Zitat
susa71

Registriert seit: 9. Dez 2004
Ort: Hamburg
5 Beiträge
 
Delphi 7 Professional
 
#5

Re: StoredProcedure Ergebnis (ZEOS/Firebird)

  Alt 9. Jan 2005, 16:00
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...

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...
  Mit Zitat antworten Zitat
urs.liska

Registriert seit: 6. Aug 2003
Ort: Freiburg
195 Beiträge
 
Delphi 6 Professional
 
#6

Re: StoredProcedure Ergebnis (ZEOS/Firebird)

  Alt 9. Jan 2005, 18:28
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...
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ßenEXECUTE 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
  Mit Zitat antworten Zitat
susa71

Registriert seit: 9. Dez 2004
Ort: Hamburg
5 Beiträge
 
Delphi 7 Professional
 
#7

Re: StoredProcedure Ergebnis (ZEOS/Firebird)

  Alt 9. Jan 2005, 19:07
Hallo Urs,

das war in der Tat kein Tippfehler nur hier im Forum, sondern auch im Code...


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...
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 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