Vorverarbeiten von Anweisungstext (FireDAC)
Nach oben zu Arbeiten mit Anweisungen (FireDAC)
Inhaltsverzeichnis
Themen
Thema | Beschreibung |
---|---|
Makro-Funktionen für Zeichen | Liste mit Funktionen für Zeichen-Strings. |
Makro-Funktionen für numerische Werte | Liste mit Funktionen für Zahlen. |
Makro-Funktionen für Datums- und Uhrzeitwerte | Liste mit Funktionen für Datums- und Uhrzeitwerte. |
Makro-Funktionen für Systemwerte | Liste mit Sonderfunktionen. |
Makro-Funktionen für die Konvertierung | Beschreibt die Funktion CONVERT. |
Einheitliche Unterstützung für RETURNING | FireDAC unterstützt die RETURNING-Klausel von Firebird, Oracle und PostgreSQL. |
Allgemeine Informationen
In diesem Text werden "Makro" und "Escape-Sequenz" an mehreren Stellen als austauschbare Begriffe verwendet. FireDAC unterstützt drei Typen vom Makroanweisungen:
- Substitutionsvariablen. Ermöglichen das Einfügen von Substitutionsparametern in einen Anweisungstext, um die Verwendung der Parameter zu erweitern. Um beispielsweise einen Tabellennamen in der FROM-Klausel oder die Spaltennamen in der SELECT-Klausel zu parametrisieren, können Sie Substitutionsvariablen, aber keine Parameter verwenden.
- Escape-Sequenzen. Ermöglichen das Schreiben von DBMS-unabhängigen SQL-Anweisungen.
- Bedingte Substitutionen. Ermöglichen das bedingte Erweitern der SQL-Anweisung, unabhängig von in der Anwendung definierten Attributen oder von dem aktuell zugeordneten DBMS.
Durch Setzen der CommandText- oder SQL-Eigenschaftswerte wird automatisch die Sammlungseigenschaft Macros gefüllt, wenn die Eigenschaft ResourceOptions.MacroCreate auf True gesetzt ist. Beim Aufruf von Prepare wandelt der FireDAC-Anweisungspräprozessor den Anweisungstext in eine Form um, die vom DBMS verstanden wird, wenn ResourceOptions.MacroExpand True ist. Das bedeutet, dass die Makros für das DBMS nicht sichtbar sind.
Die Sammlungseigenschaft Params wird automatisch gefüllt, wenn der ResourceOptions.ParamCreate-Wert True ist. Beim Aufruf von Prepare ersetzt FireDAC die FireDAC-Parametermarker durch die DBMS-nativen Marker, wenn ResourceOptions.ParamExpand True ist.
Die Escape-Sequenzen und bedingten Substitutionen werden verarbeitet, wenn ResourceOptions.EscapeExpand True ist.
SQL-Dialektabstraktion
Soll die Anwendung mehrere DBMSs unterstützen, muss berücksichtigt werden, dass die SQL-Dialekte der einzelnen DBMSs unterschiedlich sein können. Die Escape-Sequenzen von FireDAC ermöglichen das Schreiben von SQL-dialektunabhängigen SQL-Anweisungen.
Beispielsweise ist die Funktion zum Konvertieren von Strings in Großbuchstaben in MySQL, Oracle und Microsoft SQL Server unterschiedlich. Aber die folgende Anweisung funktioniert mit jedem DBMS:
SELECT {ucase(Name)} FROM MyTable
Für SQLite müssen Sie der "uses"-Klausel die Unit FireDAC.Stan.ExprFuncs
hinzufügen. In komplexeren Fällen müssen Teile der Anweisung oder sogar die gesamte Anweisung unterschiedlich geschrieben werden. In diesen Fällen sind die bedingten FireDAC-Escape-Sequenzen hilfreich:
{IF Oracle} SELECT * FROM OracleTab {fi}
{IF MSSQL} SELECT * FROM MSSQLTab {fi}
Substitutionsvariablen
Eine Substitutionsvariable beginnt mit den Symbolen "!" oder "&" gefolgt vom Makro-Variablennamen. Zum Beispiel:
SELECT * FROM &TabName
Die Symbole haben die folgende Bedeutung:
- "!" – "String"-Substitutionsmodus. Der Makrowert wird "wie vorhanden" direkt in den Anweisungstext ohne Umwandlung eingesetzt.
- "&" – "SQL"-Substitutionsmodus. Der Makrowert wird abhängig vom Datentyp des Makros anhand der DBMS-Syntaxregeln eingesetzt.
Verwenden Sie die Makros analog zu dem folgenden Codefragment:
FDQuery1.SQL.Text := 'SELECT * FROM &TabName';
FDQuery1.MacroByName('TabName').AsRaw := 'Orders';
FDQuery1.Open;
Die Makros werden verarbeitet, wenn ResourceOptions.MacroCreate und MacroExpand auf True gesetzt sind.
Parametermarker
Ein Parametermarker beginnt mit dem Symbol ":" gefolgt von dem Parameternamen. Zum Beispiel:
SELECT * FROM Orders WHERE OrderDate > :FROM_DATE
Das Symbol "?" wird als unbenannter Parametermarker gewertet. Und zwar aus Gründen der Kompatibilität mit DataSnap. Dieses Symbol sollte nicht in normalen FireDAC-Anwendungen verwendet werden.
Lesen Sie zur Verwendung von Parametern auch das Kapitel "Verwenden von Parametern" unter Ausführen von Anweisungen. Die Parameter werden verarbeitet, wenn ResourceOptions.ParamCreate und ParamExpand auf True gesetzt sind.
Escape-Sequenzen
FireDAC verfügt über 5 Typen von Escape-Sequenzen:
- Zulassen von Konstantensubstitution.
- Zulassen von Bezeichnersubstitution.
- Bedingte Substitution.
- Escape-Sequenzen für den LIKE-Operator.
- Skalare Funktionen.
Die Escape-Sequenzen werden verarbeitet, wenn ResourceOptions.EscapeExpand True ist.
Die Escape-Sequenzen zur Konstantensubstitution ermöglichen das Aufnehmen von Konstanten in den Anweisungstext, unabhängig von der DBMS-Syntax und den länderspezifischen Einstellungen. In der folgenden Tabelle wird die Erweiterung von Escape-Sequenzen in die DBMS-Syntax beschrieben:
Format | Beschreibung |
---|---|
{e <Zahl>} | Zahlenkonstante. <Zahl> muss mit "." als Dezimalzeichen angegeben werden.
Zum Beispiel: {e 123.7} -> 123,7 für MS Access |
{d <Datum>} | Datumskonstante. <Datum> muss im Format "yyyy-mm-dd" angegeben werden.
Zum Beispiel: {d 2004-08-30} -> TO_DATE('2004-08-30', 'yyyy-mm-dd') für Oracle. |
{t <Uhrzeit>} | Uhrzeitkonstante. <Uhrzeit> muss im Format "hh24:mi:ss" angegeben werden.
Zum Beispiel: {t 14:30:00} -> CONVERT(DATETIME, '14:30:00', 114) für SQL Server |
{dt <Datum & Uhrzeit>} | Datums- und Uhrzeitkonstante. <Datum & Uhrzeit> müssen in den obigen Formaten angegeben werden. |
{l <Boolescher Wert>} | Boolesche Konstante. <Boolescher Wert> ist False oder True. Wenn das DBMS den booleschen Datentyp unterstützt, dann wird die Sequenz zur Typkonstante erweitert, andernfalls wird sie zu den numerischen Werten 0 oder 1 erweitert. |
{s <String>} | String-Konstante. <String> ist eine Zeichenfolge mit oder ohne Anführungszeichen.
Zum Beispiel: {s Company '1st Coding'} -> 'Company 1st Coding' |
Die Escape-Sequenz zur Bezeichnersubstitution ermöglicht die Loslösung von DBMS-spezifischen Regeln zum Setzen von Anführungszeichen für Bezeichner. Weitere Einzelheiten finden Sie unter Objektnamen. Die Syntax lautet:
Format | Beschreibung |
---|---|
{id <Bezeichnername>} | Erweitert in die DBMS-spezifische Syntax zum Setzen von Anführungszeichen für Bezeichner.
Zum Beispiel: {id Order Details} -> "Order Details" für Oracle. |
Die Escape-Sequenz für Funktionen ermöglicht die Loslösung von einer DBMS-spezifischen Menge von integrierten Funktionen und deren Syntax. Die Syntax lautet:
Format | Beschreibung |
---|---|
{fn <Funktionsname>(<Argumente>)} | Die Syntax und der Satz der Escape-Funktionen sind identisch mit den ODBC-Escape-Funktionen. In den Unterthemen sind die Escape-Funktionen von FireDAC aufgeführt.
Zum Beispiel: SELECT * FROM MyTab WHERE Year = {fn YEAR({fn NOW()}} oder SELECT * FROM MyTab WHERE Year = {YEAR({NOW()}} -> SELECT * FROM MyTab WHERE Year = TO_NUMBER(TO_CHAR(SYSDATE, 'YYYY')) für Oracle. |
{<Funktionsname>(<Argumente>)} | Siehe oben. |
Bedingte Substitution
Escape-Sequenzen für die bedingte Substitution ermöglichen das Einsetzen von Text in Anweisungen, abhängig von einem DBMS, mit dem die Anwendung verbunden ist, oder von einem Makro-Variablenwert. Neben der unterschiedlichen Syntax werden auch Parameter und Makros unterschiedlich behandelt. Die Syntax für die Escape-Sequenzen lautet:
Format | Beschreibung |
---|---|
{iif (X1, Y1, …, XN, YN, YN+1) } | Hier ist Xi entweder:
Wenn keine dieser Bedingungen erfüllt ist und Text für YN+1 angegeben wird, dann wird er in die Anweisung eingefügt. Parameter und Makros in jedem Xi und Yi werden in den Params- und Macros-Sammlungen erstellt. |
{if x} y {fi} | Hier ist X entweder:
Parameter und Makros in Y werden nur in den Params- und Macros-Sammlungen erstellt, wenn X True ist. |
Die DBMS-Bezeichner von FireDAC berücksichtigen die Groß-/Kleinschreibung. Die folgende Tabelle enthält die Bezeichner:
Bezeichner | DBMS |
---|---|
|
Advantage Database Server |
|
Sybase SQL Anywhere |
|
IBM DB2 |
|
Firebird |
|
Informix |
|
InterBase |
|
Microsoft Access-Datenbank |
|
Microsoft SQL Server |
|
MySQL Server |
|
Oracle Server |
|
Beliebiges nicht in der Tabelle enthaltenes DBMS. |
|
PostgreSQL Server |
|
SQLite-Datenbank |
|
Teradata Database |
Zum Beispiel:
{iif (Oracle, TO_CHAR, MSSQL, CONVERT)} -> ‘TO_CHAR’ on Oracle and ‘CONVERT’ on SQL Server.
{iif (&v1, Me, &v2, You, We)} -> ‘Me’ if &v1 has nonempty value, ‘you’ if &v2 has nonempty value, otherwise ‘We’.
{if Oracle} TO_CHAR {fi} {if MSSQL} CONVERT {fi} -> TO_CHAR on Oracle and CONVERT on SQL Server.
{if &v1} Me {fi} {if &v2} You {fi} -> ‘Me’ if &v1 has nonempty value + ‘you’ if &v2 has nonempty value.
Beachten Sie, dass die Escape-Funktionen IF/IIF
dieselben Namen verwenden. Verwenden Sie die Syntax {fn IF(...)}
oder {fn IIF(...)}
, um eine Funktion von einer bedingten Substitution zu unterscheiden.
Verarbeitung von Sonderzeichen
Gehen Sie folgendermaßen vor, um Sonderzeichen, wie "!", "&", ":", "?", "{" oder "}", an das DBMS weiterzugeben:
- Verdoppeln Sie Sonderzeichen (z. B. "{{").
- Stellen Sie für MySQL dem Sonderzeichen dieses Zeichen "\" voran (z. B. "\"").
- Setzen Sie für "!", "&", "{", "}" ResourceOptions.MacroCreate, MacroExpand und EscapeExpand auf False.
- Setzen Sie für ":", "?" ResourceOptions.ParamCreate, ParamExpand auf False.
Andernfalls werden die Zeichen "!", "&", "{", "}" als Makro-Anweisung und die Zeichen ":", "?" als Parametermarker behandelt, außer in den folgenden Fällen, wenn eine Konstruktion von FireDAC gefunden und nicht als Parametermarker behandelt wird:
- Der Oracle PL/SQL-Zuweisungsoperator.
- Die Parameter
EXECUTE BLOCK
inBEGIN … END
von Firebird. - Die TSQL-Beschriftung.
- Der PostgreSQL- und Informix-Umwandlungsoperator "::".
- Das Informix-Katalogtrennzeichen ":".
Siehe auch
Beispiel
- FireDAC TFDTableAdapter Main (Beispiel)
- FireDAC TFDQuery Macros (Beispiel)
- FireDAC IFDPhysCommand Macros (Beispiel)
- Funktionen von FireDAC IFDPhysCommand Escape (Beispiel)