Anweisungsstapel (FireDAC)

Aus Appmethod Topics
Wechseln zu: Navigation, Suche

Nach oben zu Arbeiten mit Anweisungen (FireDAC)

Allgemeine Informationen

Ein Anweisungsstapel ist eine Gruppe von SQL-Anweisungen, die auf einmal von einer Anwendung an ein DBMS zur Ausführung gesendet werden. Das DBMS compiliert die Anweisungen eines Stapels in einen einzelnen Ausführungsplan. Die Anweisungen im Ausführungsplan werden dann auf einmal ausgeführt. Dadurch werden der Netzwerkverkehr und die Serverauslastung minimiert. Nach der Ausführung gibt das DBMS die von der Anweisung erzeugten Client-Ergebnismengen zurück.


Verarbeiten von Ergebnismengen

Mit der FireDAC-Methode NextRecordSet können Sie alle Ergebnismengen nacheinander verarbeiten. Um die Verarbeitung aller Ergebnismengen zu aktivieren, müssen Sie FetchOptions.AutoClose vor Ausführung der Anweisung auf False setzen. Andernfalls wird direkt nach Erreichen von EOF beim ersten Cursor dieser geschlossen und andere Cursors werden verworfen.

Hier ein Beispiel für SQL Server:

 FDQuery1.FetchOptions.AutoClose := False;
 FDQuery1.SQL.Add('select * from [Orders]');
 FDQuery1.SQL.Add('select * from [Order Details]');
 FDQuery1.Open; // [Orders] table rows are accessable here
 FDQuery1.NextRecordSet; // [Order Details] table rows available here

Eine Anwendung kann jede Ergebnismenge in einer separaten Datenmenge speichern. Dazu werden die Eigenschaften TFDMemTable und Data verwendet. Zum Beispiel:

 FDQuery1.FetchOptions.AutoClose := False;
 FDQuery1.SQL.Text := 'select * from orders; select * from customers';
 
 FDQuery1.Open;
 FDQuery1.FetchAll;
 // assign orders records to FDMemTable1
 FDMemTable1.Data := FDQuery1.Data;
 
 FDQuery1.NextRecordSet;
 FDQuery1.FetchAll;
 // assign customers records to FDMemTable2
 FDMemTable2.Data := FDQuery1.Data;

FireDAC überspringt automatisch leere Ergebnismengen, die keine Spalten und Zeilen enthalten.


DBMS und Stapel

Ein DBMS muss Anweisungsstapel unterstützen, die mit FireDAC ausgeführt werden. Wenn ein DBMS keine Stapel unterstützt, können Sie SQL-Skripte verwenden. In der folgenden Tabelle sind die DBMSs aufgeführt, die Stapel unterstützen:

DBMS Bemerkungen
IBM DB2 Die Anweisungen müssen durch ";" getrennt werden.
Firebird Verwenden Sie die EXECUTE BLOCK-Konstruktion.
Informix Die Anweisungen müssen durch ";" getrennt werden. Der Stapel darf nur eine einzige Anweisung zum Zugreifen auf die DB enthalten.
Microsoft SQL Server Optional können die Anweisungen durch ";" getrennt werden.
MySQL Die Anweisungen müssen durch ";" getrennt werden.
Oracle Verwenden Sie die anonyme BEGIN END-Blockkonstruktion.
PostgreSQL Die Anweisungen müssen durch ";" getrennt werden. Ein Stapel ohne Parameter kann ausgeführt werden, wenn ResourceOptions.DirectExecute auf True gesetzt ist. Verwenden Sie für PostgreSQL Version >= 9.0 die anonyme DO BEGIN END-Blockkonstruktion.
SQLite Die Anweisungen müssen durch ";" getrennt werden.
SQL Anywhere Optional können die Anweisungen durch ";" getrennt werden.

FireDAC unterstützt auch Anweisungen, die mehrere Ergebnismengen zurückgeben. Dazu einige Beispiele:

  • Gespeicherte Oracle-Prozeduren mit REF CURSOR.
  • Oracle-Ergebnismengen mit verschachtelten Cursors.
  • PostgreSQL-Varianten von Anweisungen, die Cursors zurückgeben.
Hinweis: Zum Ausführen von mehreren INSERT/UPDATE/DELETE-Anweisungen sollten Sie die Verwendung des Array DML-Features in Betracht ziehen, das für große Stapel weitaus effektiver ist.

Siehe auch