Vorverarbeiten von Anweisungstext (FireDAC)

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Arbeiten mit Anweisungen (FireDAC)


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:
  • Ein DBMS-Bezeichner. Wenn eine Anwendung mit diesem DBMS verbunden ist, dann wird der Yi-Text in die Anweisung eingefügt.
  • Eine Makrovariable. Wenn deren Wert nicht leer ist, wird der Yi-Text in die Anweisung eingefügt.

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:
  • Ein DBMS-Bezeichner. Wenn eine Anwendung mit diesem DBMS verbunden ist, dann wird der Y-Text in die Anweisung eingefügt.
  • Eine Makrovariable. Wenn deren Wert nicht leer ist, wird der Y-Text in die Anweisung eingefügt.

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

ADS

Advantage Database Server

ASA

Sybase SQL Anywhere

DB2

IBM DB2

FIREBIRD

Firebird

INFORMIX

Informix

INTRBASE

InterBase

MSACCESS
MSACC

Microsoft Access-Datenbank

MSSQL

Microsoft SQL Server

MYSQL

MySQL Server

ORACLE
ORA

Oracle Server

OTHER

Beliebiges nicht in der Tabelle enthaltenes DBMS.

POSTGRESQL
PG

PostgreSQL Server

SQLITE

SQLite-Datenbank

TDATA
TERADATA

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:

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 in BEGIN … END von Firebird.
  • Die TSQL-Beschriftung.
  • Der PostgreSQL- und Informix-Umwandlungsoperator "::".
  • Das Informix-Katalogtrennzeichen ":".

Siehe auch

Beispiel