Home » Tutorials » Datenbanken » ZEOS Library – Einsatz mit Delphi und Firebird

ZEOS Library – Einsatz mit Delphi und Firebird

TZStoredProc

Mit dieser Komponente ist es möglich, Stored Procedures einer Datenbank auszuführen. Man unterscheidet Stored Procedures in zwei Kategorien: Solche, die keine Ergebnismenge zurück liefern und solche, die eine Ergebnismenge zurück liefern. TZStoredProc funktioniert ähnlich, wie die BDE-Komponente. Der einzige Unterschied besteht darin, dass vor dem Aufruf von ExecProc kein explizites Prepare durchgeführt werden muss.

Stored Procedures mit einer Ergebnismenge

Wenn eine StoredProc eine Ergebnismenge zurückliefert, dann wird sie einfach nur (nachdem evtl. vorhandene Parameter mit Werten belegt wurden) mit einem Open geöffnet:

 with spSumByName do begin
 Close;
 ParamByName('Name').Value := 'WeißIchWie';
 Open;
end;

Die Ergebnismenge kann anschließend ähnlich wie bei einem normalen TZQuery behandelt werden.

Stored Procedures ohne Ergebnismenge

Hat die StoredProc keine Ergebnismenge, dann wird sie mit ExecProc aufgerufen, nachdem die Parameter ggf. mit Werten versorgt wurden. Dazu ein Beispiel (es gilt: conConnection.AutoCommit = True):

with spDeleteByName do begin
  ParamByName('Name').Value := 'WeißIchWie';
  conConnection.StartTransaction
  try
    // StoredProc ausführen
    ExecProc;
  except
    conConnection.Rollback;
  end;
  conConnection.Commit;
end;

Vorsicht Fehler in der ZEOS Library V 6.1.5!

Wurde eine StoredProc mindestens einmal über ExecProc aufgerufen, dann wird beim späteren lösen der Datenbankverbindung (Disconnect) eine Exception „invalid statement handle“ mit der SQL-Fehlernummer -901 ausgelöst. Dieser Fehler tritt nicht auf, wenn die StoredProc über ein TZQuery oder TZReadOnlyQuery ausgeführt wird. Die Ausführung der StoredProc muss dann als SQL-Befehl in folgender Form in der Property SQL festgelegt werden:

EXECUTE PROCEDURE DeleteByName (:Name)

Die Ausführung geschieht dann ähnlich wie in der StoredProc. Es gilt wie oben: conConnection.AutoCommit = True:

// ein TZQuery-Objekt wird benutzt
with qryDeleteByName do begin
  ParamByName('Name').Value := 'WeißIchWie';
  conConnection.StartTransaction
  try 
    ExecSQL;
    // SQL-Statement im TZQuery-Objekt ausführen
  except
    conConnection.Rollback;
  end;
  conConnection.Commit;
end;

Info: Auch bei Dialekt 3 Datenbanken muss der Name der StoredProc nicht in Anführungszeichen stehen. Namen von Stored Procedures sind nicht case-sensitive.

Probleme von TZStoredProc bei Dialekt-1-Datenbanken

Ein weiteres Problem ist, dass die Metadaten von StoredProcs aus Datenbanken des Dialekt 1 nicht korrekt an die TZStoredProc-Objekte übertragen werden, wenn die StoredProc im Objektinspektor der Komponente ausgewählt wird. Die Parameterdaten werden nicht korrekt interpretiert. Ein Upgrade von Dialekt 1 auf Dialekt 3 behebt dieses Problem. Muss die Datenbank im Dialekt 1 bestehen bleiben, dann muss statt TZStoredProc ein TZQuery oder TZReadOnlyQuery eingesetzt werden.

Ein Gedanke zu „ZEOS Library – Einsatz mit Delphi und Firebird“

  1. Lieben Dank für dieses tolle Tutorial. Es ist sehr klar und übersichtlich, und eine tolle Hilfe für den Einstieg.

     

Kommentare sind geschlossen.