Firebird Documentation IndexFirebird 2.5 SprachreferenzDatentypen und Unterdatentypen → Spezialdatentypen
Firebird Home Firebird Home Zurück: BinärdatentypenFirebird Documentation IndexNach oben: Datentypen und UnterdatentypenWeiter: Datentyp-Konvertierungen

Spezialdatentypen

Inhaltsverzeichnis

SQL_NULL-Datentyp

Spezial“-Datentypen ...

SQL_NULL-Datentyp

Der Datentyp SQL_NULL besitzt keinen Wert, sondern nur einen Status: null (NULL) oder nicht null (NOT NULL). Er ist nicht verfügbar als Datentyp zur Deklaration von Tabellenfeldern, PSQL-Variablen oder als Parameterbeschreibung. Dieser Datentyp wurde eingeführt, um untypiserte Parameter in Ausdrücken mit dem IS NULL-Prädikat zu verwenden.

Ein Auswertungsproblem tritt auf, wenn optionale Filter verwendet werden, um Abfragen der folgenden Art zu erstellen:

       WHERE col1 = :param1 OR :param1 IS NULL
        

Nach der Verarbeitung auf API-Ebene, sieht die Abfrage folgendermaßen aus:

       WHERE col1 = ? OR ? IS NULL
        

Dies ist der Fall, wenn ein Entwickler eine SQL-Abfrage schreibt und der Auffassung ist, dass sich :param1 wie eine Variable verhält, sodass er diese auf zwei Arten verwenden kann. Jedoch erhält sich die Abfrage auf der API-Ebene zwei unabhängige Parameter. Der Server kann den Typen des zweiten Parameters nicht ermitteln, da dieser in Verbindung mit IS NULL steht.

Der Datentyp SQL_NULL löst dieses Problem. Wannimmer die Datenbank auf das '? IS NULL' -Prädikat in einer Abfrage stößt, weist sie dem Parameter den Typ SQL_NULL zu, was wiederum dazu führt, dass dieser Parameter nur auf „Nullbarkeit“ geprüft werden muss und der Datentyp bzw. der Wert nicht wichtig ist.

Das folgende Beispiel demonstriert die praktische Verwendung. Es verwendet 2 benannte Parameter —sagen wir, :size und :colour—welche, im Beispiel, zwei Werte vom Bildschirmtext oder Drop-Down-Listen erhalten. Jeder dieser Parameter korrospondiert mit zwei Parametern in der Abfrage.

       SELECT
         SH.SIZE, SH.COLOUR, SH.PRICE
       FROM SHIRTS SH
       WHERE (SH.SIZE = ? OR ? IS NULL)
         AND (SH.COLOUR = ? OR ? IS NULL)
        

Um zu verstehen was hier passiert, muss der Leser mit der Firebird-API sowie der Übergabe von Parametern in der XSQLVAR-Struktur vertraut sein—was unter der Haube passiert, ist nicht von Belang, sofern keine Treiber oder Anwendungen geschrieben werden, die die „nackte“ API verwenden.

Die Anwendung übergibt die parameteresierte Abfrage an den Server in der üblichen ?-Form. Paare „identischer“ Parameter können nicht in einem zusammengeführt werden, somit werden für zwei optionale Filter, beispielsweise, 4 Parameter benötigt: einer für jede ? in unserem Beispiel.

Nach dem Aufruf von isc_dsql_describe_bind(), wird der SQLTYPE des zweiten und vierten Parameters auf SQL_NULL gesetzt. Firebird hat keine Kenntnis ihrer speziellen Verbindung zu dem ersten bzw. dritten Parameter: hierfür ist allein die Anwendung verantwortlich.

Sobald die Werte für Größe (size) und Farbe (colour) festgelegt wurden (oder auch nicht), und die Abfrage ausgeführt wurde, wird jedes Paar der XSQLVARs folgendermaßen ausgefüllt:

Benutzer hat einen Wert angegeben

Erster Parameter (vergleiche Werte): Lege *sqldata auf den übergebenen Wert fest und *sqlind auf 0 (für NOT NULL)

Zweiter Parameter (teste auf NULL): Lege *sqldata auf null fest (null-Zeiger, nicht SQL NULL) und *sqlind auf 0 (für NOT NULL)

Benutzer hat das Feld leer gelassen

Beide Parameter: Setze sqldata auf null (null-Zeiger, nicht SQL NULL) und *sqlind auf -1 (repräsentiert NULL)

In anderen Worten: Der Parameter zum Vergleich des Wertes wird wie üblich gesetzt. Der SQL_NULL-Parameter wird genauso verwendet, mit dem Unterschied, dass sqldata über die gesamte Zeit hinweg null bleibt.

Zurück: BinärdatentypenFirebird Documentation IndexNach oben: Datentypen und UnterdatentypenWeiter: Datentyp-Konvertierungen
Firebird Documentation IndexFirebird 2.5 SprachreferenzDatentypen und Unterdatentypen → Spezialdatentypen