Anweisungsstapel (FireDAC)
Nach oben zu Arbeiten mit Anweisungen (FireDAC)
Inhaltsverzeichnis
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. |
Teradata Database | Die Anweisungen müssen 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
Beispiele
- FireDAC TFDQuery Batch (Beispiel)
- FireDAC TFDQuery Batch Error Handling (Beispiel)
- FireDAC IFDPhysCommand Batch (Beispiel)