Firebird Documentation IndexFirebird 2.5 SprachreferenzEingebaute Funktionen und Variablen → Kontextvariablen
Firebird Home Firebird Home Zurück: Eingebaute Funktionen und VariablenFirebird Documentation IndexNach oben: Eingebaute Funktionen und VariablenWeiter: Skalarfunktionen

Kontextvariablen

Inhaltsverzeichnis

CURRENT_CONNECTION
CURRENT_DATE
CURRENT_ROLE
CURRENT_TIME
CURRENT_TIMESTAMP
CURRENT_TRANSACTION
CURRENT_USER
DELETING
GDSCODE
INSERTING
NEW
'NOW'
OLD
ROW_COUNT
SQLCODE
SQLSTATE
'TODAY'
'TOMORROW'
UPDATING
'YESTERDAY'
USER

CURRENT_CONNECTION

Verfügbar in: DSQL, PSQL

Beschreibung: CURRENT_CONNECTION enthält den eindeutigen Bezeichner der aktuellen Verbindung.

Typ: INTEGER

Beispiele: 

select current_connection from rdb$database
execute procedure P_Login(current_connection)

Der Wert in CURRENT_CONNECTION wird in der Datenbank Headerseite gespeichert und bei einer Wiederherstellung auf 0 zurückgesetzt. Seit Version 2.1 wird dieser Wert bei jeder neuen Verbindung inkrementiert. (In vorigen Versionen, wurde der Wert nur inkrementiert, wenn der Client diesen während der Sitzung ausgelesen hat.) Daraus resultiert, dass CURRENT_CONNECTION die Anzahl der Verbindungen seit dem Anlegen —oder der aktuellsten Wiederherstellung— der Datenbank anzeigt.

CURRENT_DATE

Verfügbar in: DSQL, PSQL, ESQL

Beschreibung: CURRENT_DATE gibt das aktuelle Serverdatum zurück.

Typ: DATE

Syntax: 

CURRENT_DATE

Beispiele: 

select current_date from rdb$database
-- ergibt z.B. 2011-10-03

Hinweise: 

  • Innerhalb eines PSQL-Moduls (Prozedur, Trigger oder ausführbarer Block) bleibt der Wert von CURRENT_DATE bei jedem Lesen konstant. Wenn mehrere Module einander aufrufen oder auslösen, bleibt der Wert während der gesamten Dauer des äußersten Moduls konstant. Wenn Sie einen fortschreitenden Wert in PSQL benötigen (z. B. um Zeitintervalle zu messen), verwenden Sie 'TODAY'.

CURRENT_ROLE

Verfügbar in: DSQL, PSQL

Beschreibung: CURRENT_ROLE ist eine Kontextvariable, die die Rolle des derzeit verbundenen Benutzers enthält. Ist keine Rolle aktiv, ist CURRENT_ROLE NONE.

Typ: VARCHAR(31)

Beispiel: 

if (current_role <> 'MANAGER')
  then exception only_managers_may_delete;
else
  delete from Customers where custno = :custno;

CURRENT_ROLE repräsentiert immer eine gültige Rolle oder NONE. Wenn sich ein Benutzer mit einer nicht-existenten Rolle verbindet, wird die Engine die Rolle stillschweigend auf NONE setzen, ohne einen Fehler zurückzugeben.

CURRENT_TIME

Verfügbar in: DSQL, PSQL, ESQL

Beschreibung: CURRENT_TIME gibt die derzeitige Serverzeit zurück. In Versionen vor 2.0, ist der Bruchteil immer „.0000“, was eine effektive Genauigkeit von 0 Dezimalstellen ergibt. Ab Firebird 2.0 können Sie eine Genauigkeit angeben, wenn Sie diese Variable abfragen. Der Standardwert ist immer noch 0 Dezimalstellen, d.h. Sekundengenauigkeit.

Typ: TIME

Syntax: 

CURRENT_TIME [(precision)]

precision  ::=  0 | 1 | 2 | 3

Das optionale Argument precision wird in ESQL nicht unterstützt.

Tabelle 8.1. CURRENT_TIME Parameter

Parameter Beschreibung
Genauigkeit Präzision. Der Standardwert ist 0. In ESQL nicht unterstützt..


Beispiele: 

select current_time from rdb$database
-- ergibt z.B. 14:20:19.6170
select current_time(2) from rdb$database
-- ergibt z.B. 14:20:23.1200

Hinweise: 

  • Im Gegensatz zu CURRENT_TIME wurde der Standardwert von CURRENT_TIMESTAMP auf 3 Dezimalstellen geändert. Somit ist CURRENT_TIMESTAMP nicht länger die genaue Summe aus CURRENT_DATE und CURRENT_TIME, es sei denn, Sie geben die Genauigkeit selbst an.

  • Innerhalb eines PSQL-Moduls (Prozedur, Trigger oder ausführbarer Block) bleibt der Wert von CURRENT_TIME bei jedem Lesen konstant. Wenn mehrere Module einander aufrufen oder auslösen, bleibt der Wert während der gesamten Dauer des äußersten Moduls konstant. Wenn Sie einen fortschreitenden Wert in PSQL benötigen (z. B. um Zeitintervalle zu messen), verwenden Sie 'NOW'.

CURRENT_TIMESTAMP

Verfügbar in: DSQL, PSQL, ESQL

Beschreibung: CURRENT_TIMESTAMP gibt das aktuelle Datum und die Uhrzeit des aktuellen Servers zurück. In Versionen vor 2.0 war der Bruchteil immer „ .0000 “, was eine effektive Genauigkeit von 0 Dezimalstellen ergab. Ab Firebird 2.0 können Sie eine Genauigkeit angeben, wenn Sie diese Variable abfragen. Der Standardwert ist 3 Dezimalstellen, d. H. Millisekunden.

Typ: TIMESTAMP

Syntax: 

CURRENT_TIMESTAMP [(precision)]

precision  ::=  0 | 1 | 2 | 3

Das optionale Argument precision wird in ESQL nicht unterstützt.

Tabelle 8.2. CURRENT_TIMESTAMP Parameter

Parameter Beschreibung
Genauigkeit Präzision. Der Standardwert ist 0. In ESQL nicht unterstützt.


Beispiele: 

select current_timestamp from rdb$database
-- ergibt z.B. 2008-08-13 14:20:19.6170
select current_timestamp(2) from rdb$database
-- ergibt z.B. 2008-08-13 14:20:23.1200

Hinweise: 

  • Die Standardpräzision von CURRENT_TIME ist immer noch 0 Dezimalstellen, sodass in Firebird 2.0 und höher CURRENT_TIMESTAMP nicht mehr die exakte Summe von CURRENT_DATE und CURRENT_TIME ergibt, außer Sie geben explizit eine Genauigkeit an.

  • Innerhalb eines PSQL-Moduls (Prozedur, Trigger oder ausführbarer Block) bleibt der Wert von CURRENT_TIMESTAMP bei jedem Lesen konstant. Wenn mehrere Module einander aufrufen oder auslösen, bleibt der Wert während der gesamten Dauer des äußersten Moduls konstant. Wenn Sie einen fortschreitenden Wert in PSQL benötigen (z. B. um Zeitintervalle zu messen), verwenden Sie 'NOW'.

CURRENT_TRANSACTION

Verfügbar in: DSQL, PSQL

Beschreibung: CURRENT_TRANSACTION beinhaltet den eindeutigen Bezeichner der aktuellen Transaktion.

Typ: INTEGER

Beispiele: 

select current_transaction from rdb$database
New.Txn_ID = current_transaction;

Der Wert von CURRENT_TRANSACTION wird in der Datenbank-Header-Seite vorgehalten und beim Wiederherstellen auf 0 zurückgesetzt. Dieser wird mit jeder neuen Transaktion inkrementiert.

CURRENT_USER

Verfügbar in: DSQL, PSQL

Beschreibung: CURRENT_USER ist eine Kontextvariable, die den Namen des aktuell verbundenen Benutzers enthält. Diese ist vollständig äquivalent zu USER .

Typ: VARCHAR(31)

Beispiel: 

create trigger bi_customers for customers before insert as
begin
  New.added_by  = CURRENT_USER;
  New.purchases = 0;
end

DELETING

Verfügbar in: PSQL

Beschreibung: Nur in Triggern verfügbar. DELETING gibt an, ob der Trigger durch eine Löschoperation (DELETE) ausgelöst wurde. Vorgesehen für den Einsatz in Multi-Aktions-Trigger.

Typ: boolean

Beispiel: 

if (deleting) then
begin
  insert into Removed_Cars (id, make, model, removed)
    values (old.id, old.make, old.model, current_timestamp);
end

GDSCODE

Verfügbar in: PSQL

Beschreibung: In einem „WHEN ... DO“-Fehlerbehandlungsblock, enthält die GDSCODE-Kontextvariable die numerische Repräsentation des derzeitigen Firebird-Fehlercodes. Vor Firebird 2.0, wurde GDSCODE nur innerhalb eines WHEN GDSCODE-Handlers gesetzt. Nun kann es in WHEN ANY, WHEN SQLCODE und WHEN EXCEPTION auch nicht-null sein, vorausgesetzt, die Bedingung, die den Fehler verursacht, entspricht einem Firebird Fehlercode. Außerhalb der Fehler-Handler ist GDSCODE ist immer 0. Außerhalb von PSQL existiert es überhaupt nicht.

Typ: INTEGER

Beispiel: 

when gdscode grant_obj_notfound, gdscode grant_fld_notfound,
     gdscode grant_nopriv, gdscode grant_nopriv_on_base
do
begin
  execute procedure log_grant_error(gdscode);
  exit;
end

Hinweis

Nach WHEN GDSCODE müssen Sie symbolische Namen wie z.B. grant_obj_notfound etc. verwenden. Jedoch ist die Kontextvariable GDSCODE ein INTEGER. Wenn Sie es mit einem bestimmten Fehler vergleichen möchten, muss der numerische Wert verwendet werden, z.B. 335544551 für grant_obj_notfound.

INSERTING

Verfügbar in: PSQL

Beschreibung: Nur in Triggern verfügbar. INSERTING gibt an, ob der Trigger durch eine Einfügeoperation (INSERTING) ausgelöst wurde. Vorgesehen für den Einsatz in Multi-Aktions-Trigger.

Typ: boolean

Beispiel: 

if (inserting or updating) then
begin
  if (new.serial_num is null) then
    new.serial_num = gen_id(gen_serials, 1);
end

NEW

Verfügbar in: PSQL, triggers only

Beschreibung: NEW beinhaltet die neue Version einer Datenbankzeile, die gerade eingefügt oder aktualisiert wurde. Seit Firebird 2.0 steht diese nur noch im Lesemodus in AFTER-Triggern zur Verfügung.

Typ: Datenzeile

Anmerkung

In Multi-Aktions-Triggern—eingeführt in Firebird 1.5—ist NEW immer verfügbar. Wurde der Trigger jedoch durch ein DELETE ausgelöst, existiert keine neue Version des Datensatzes. In diesem Falle wird das Lesen von NEW immer NULL zurückgeben; das Schreiben hierein wird in einem Laufzeitfehler resultieren.

'NOW'

Verfügbar in: DSQL, PSQL, ESQL

Geändert in: 2.0

Beschreibung: 'NOW' ist keine Variable, sondern ein String-Literal. Es ist jedoch speziell in dem Sinne, dass, wenn Sie es mittels CAST() zu einem Datum / Uhrzeit-Typ umwandeln, Sie das aktuelle Datum und / oder Uhrzeit erhalten. Der Bruchteil der Zeit war immer „.0000“, was eine effektive Sekundengenauigkeit ergab. Seit Firebird 2.0 beträgt die Genauigkeit 3 Dezimalstellen, d.h. Millisekunden. 'NOW' unterscheidet nicht zwischen Groß- und Kleinschreibung, und die Engine ignoriert beim Casting führende oder nachgestellte Leerzeichen.

Hinweis: Bitte beachten Sie, dass diese Abkürzungsausdrücke sofort bei der Analyse ausgewertet werden und gleich bleiben, solange die Anweisung vorbereitet bleibt. Selbst wenn eine Abfrage mehrere Male ausgeführt wird, änder sich der Wert für z.B. „timestamp 'now'“ nicht, egal wie viel Zeit vergeht. Wenn Sie den Wert für den Fortschritt benötigen (d.h. bei jedem Aufruf ausgewertet werden), verwenden Sie eine vollständige Umwandlung.

Typ: CHAR(3)

Beispiele: 

select 'Now' from rdb$database
-- ergibt 'Now'
select cast('Now' as date) from rdb$database
-- ergibt z.B. 2008-08-13
select cast('now' as time) from rdb$database
-- ergibt z.B. 14:20:19.6170
select cast('NOW' as timestamp) from rdb$database
-- ergibt z.B. 2008-08-13 14:20:19.6170

Kurzschreibweisen für Casts von Datums- und Zeit-Datentypen für die letzten drei Statements:

select date 'Now' from rdb$database
select time 'now' from rdb$database
select timestamp 'NOW' from rdb$database

Hinweise: 

  • 'NOW' gibt immer die aktuelle Uhrzeit bzw. das aktuelle Datum zurück, auch in PSQL-Modulen, in denen CURRENT_DATE, CURRENT_TIME und CURRENT_TIMESTAMP während der gesamt Laufzeit der äußeren Routine den selben Wert liefern. Dies macht 'NOW' nützlich zum Messen von Zeitintervallen in Triggern, Prozeduren und ausführbaren Blöcken.

  • Außer in der oben genannten Situation, ist das Lesen von CURRENT_DATE, CURRENT_TIME und CURRENT_TIMESTAMP dem Casting gundsätzlich vorzuziehen 'NOW'. Seien Sie sich jedoch bewusst, dass CURRENT_TIME standardmäßig sekundengenau ist; um millisekundengenaue Genauigkeit zu erhalten, nutzen Sie CURRENT_TIME(3).

OLD

Verfügbar in: PSQL, triggers only

Beschreibung: OLD beinhaltet die existierende Version einer Datenbankzeile, gerade vor dem Aktualisieren oder Löschen. Seit Firebird 2.0 ist dies nur lesend.

Typ: Datenzeile

Anmerkung

In Multi-Aktions-Triggern —eingeführt inFirebird 1.5— ist OLD immer verfügbar. Wird der Trigger jedoch durch ein INSERT ausgelöst, existiert offensichtlich keine Vor-Version des Datensatzes. In diesem Falle, gibt OLD immer NULL zurück; schreiben wird in einem Laufzeitfehler enden.

ROW_COUNT

Verfügbar in: PSQL

Geändert in: 2.0

Beschreibung: Die Kontextvariable ROW_COUNT enhält die Anzahl der Zeilen, die durch das letzte DML-Statement (INSERT, UPDATE, DELETE, SELECT oder FETCH) im derzeitigen Trigger, Stored Procedure oder ausführbaren Block betroffen sind.

Typ: INTEGER

Beispiel: 

update Figures set Number = 0 where id = :id;
if (row_count = 0) then
  insert into Figures (id, Number) values (:id, 0);

Verhalten von SELECT und FETCH

  • Nach einem einzelnen SELECT, ist ROW_COUNT gleich 1, sofern eine Datenzeile zurückgegeben wurde, andernfalls 0.

  • In einer FOR SELECT-Schleife wird ROW_COUNT mit jeder Iteration inkrementiert (beginnend bei 0 vor dem ersten Durchlauf).

  • Nach einem FETCH durch einen Cursor, ist ROW_COUNT gleich 1, falls eine Datenzeile zurückgegeben wurde und andernfalls 0. Werden weitere Datenzeilen durch den gleichen Cursor geholt, wird ROW_COUNTnicht über 1 hinaus inkrementiert.

  • In Firebird 1.5.x ist ROW_COUNT0 nach jeder Art von SELECT-Anweisung.

Anmerkung

ROW_COUNT kann nicht verwendet werden um die Anzahl der betroffenen Zeilen eines EXECUTE STATEMENT- oder EXECUTE PROCEDURE-Befehls zu erhalten.

SQLCODE

Verfügbar in: PSQL

Veraltet ab: 2.5.1

Beschreibung: In einem „WHEN ... DO“-Fehlerbehandlungsblock enthält die SQLCODE-Kontextvariable den aktuellen SQL-Fehlercode. Vor Firebird 2.0 wurde SQLCODE nur in WHEN SQLCODE- und WHEN ANY-Handlern. Nun kann es auch in WHEN GDSCODE und WHEN EXCEPTION ungleich null sein, vorausgesetzt, die Bedingung, die den Fehler auslöst, entspricht einem SQL-Fehlercode. Außerhalb der Error-Handler ist SQLCODE immer 0. Außerhalb PSQL ist es überhaupt nicht vorhanden.

Typ: INTEGER

Beispiel: 

when any
do
begin
  if (sqlcode <> 0) then
    Msg = 'An SQL error occurred!';
  else
    Msg = 'Something bad happened!';
  exception ex_custom Msg;
end

Wichtiger Hinweis: SQLCODE ist im Rahmen des SQL-2003-konformen SQLSTATE-Statuscodes veraltet. Die Unterstützung für SQLCODE und WHEN SQLCODE wird in einer späteren Firebird-Version entfernt werden.

SQLSTATE

Verfügbar in: PSQL

Aufgenommen in: 2.5.1

Beschreibung: In einem „WHEN ... DO“-Error-Handler enthält die SQLSTATE-Kontextvariable den 5 Zeichen langen, SQL-2003-konformen Statuscode, der vom Statement erzeugt wurde, das den Fehler verursacht hat. Außerhalb der Error-Hander ist SQLSTATE immer '00000'. Außerhalb PSQL ist es nicht verfügbar.

Typ: CHAR(5)

Beispiel: 

when any
do
begin
  Msg = case sqlstate
          when '22003' then 'Numeric value out of range.'
          when '22012' then 'Division by zero.'
          when '23000' then 'Integrity constraint violation.'
          else 'Something bad happened! SQLSTATE = ' || sqlstate
        end;  
  exception ex_custom Msg;
end

Hinweise: 

  • SQLSTATE soll SQLCODE ersetzen. Letzteres ist jetzt in Firebird veraltet und wird in einer zukünftigen Version verschwinden.

  • Firebird unterstützt (noch) nicht die Syntax „WHEN SQLSTATE ... DO“. Sie müssen WHEN ANY verwenden und die Variable SQLSTATE im Handler testen.

  • Jeder SQLSTATE-Code ist die Verkettung einer 2-Zeichen-Klasse und einer 3-Zeichen-Unterklasse. Die Klassen 00 (erfolgreicher Abschluss), 01 (Warnung) und 02 (keine Daten) repräsentieren Abschlussbedingungen. Jeder Statuscode außerhalb dieser Klassen ist eine Ausnahme. Da die Klassen 00, 01 und 02 keinen Fehler verursachen, werden sie niemals in der SQLSTATE-Variable angezeigt.

  • Für eine vollständige Auflistung der SQLSTATE-Codes, konsultieren Sie bitte den Abschnitt SQLSTATE Fehlercodes und Meldungen in Appendix B: Fehlercodes und Meldungen.

'TODAY'

Verfügbar in: DSQL, PSQL, ESQL

Beschreibung: 'TODAY' ist keine Variable, sondern ein String-Literal. Es ist jedoch speziell im Sinne dass Sie das aktuelle Datum erhalten, wenn Sie ein CAST() zu einem Datum / einer Zeit durchführen. 'TODAY' unterscheided nicht zwischen Groß- und Kleinschreibung. Die Engine ignoriert führende oder nachstehende Leerzeichen beim Umwandeln.

Typ: CHAR(5)

Beispiele: 

select 'Today' from rdb$database
		-- ergibt 'Today'
select cast('Today' as date) from rdb$database
		-- ergibt z.B. 2011-10-03
select cast('TODAY' as timestamp) from rdb$database
		-- ergibt z.B. 2011-10-03 00:00:00.0000

Kurzschreibweisen für Casts von Datums- und Zeit-Datentypen für die letzten beiden Statements:

select date 'Today' from rdb$database
		select timestamp 'TODAY' from rdb$database

Hinweise: 

  • 'TODAY' gibt immer das aktuelle Datum zurück, auch in PSQL-Modulen, in denen CURRENT_DATE, CURRENT_TIME und CURRENT_TIMESTAMP den gleichen Rückgabewert während der gesamten Dauer der äußersten Routine hat. Dies macht 'TODAY' nützlich für die Messung von Zeitintervallen in Triggern, Prozeduren und ausführbaren Blöcken (zumindest, wenn Ihre Prozeduren für mehrere Tage läuft.).

  • Außer in der oben genannten Situation ist das Lesen von CURRENT_DATE im Allgemeinen besser als das Konvertieren von 'NOW'.

'TOMORROW'

Verfügbar in: DSQL, PSQL, ESQL

Beschreibung: 'TOMORROW' ist keine Variable, sondern ein String-Literal. Es ist jedoch speziell im Sinne dass Sie das Datum des nächsten Tages erhalten, wenn Sie ein CAST() zu einem Datum / einer Zeit durchführen. 'TOMORROW' unterscheided nicht zwischen Groß- und Kleinschreibung. Die Engine ignoriert führende oder nachstehende Leerzeichen beim Umwandeln. Siehe auch 'TODAY'.

Typ: CHAR(8)

Beispiele: 

select 'Tomorrow' from rdb$database
		-- ergibt 'Tomorrow'
select cast('Tomorrow' as date) from rdb$database
		-- ergibt z.B. 2011-10-04
select cast('TOMORROW' as timestamp) from rdb$database
		-- ergibt z.B. 2011-10-04 00:00:00.0000

Kurzschreibweisen für Casts von Datums- und Zeit-Datentypen für die letzten beiden Statements:

select date 'Tomorrow' from rdb$database
		select timestamp 'TOMORROW' from rdb$database

UPDATING

Verfügbar in: PSQL

Beschreibung: Nur in Triggern verfügbar. UPDATING gibt an, ob der Trigger durch eine Aktualisierungsoperation (UPDATING) ausgelöst wurde. Vorgesehen für den Einsatz in Multi-Aktions-Trigger.

Typ: boolean

Beispiel: 

if (inserting or updating) then
begin
  if (new.serial_num is null) then
    new.serial_num = gen_id(gen_serials, 1);
end

'YESTERDAY'

Verfügbar in: DSQL, PSQL, ESQL

Beschreibung: 'YESTERDAY' ist keine Variable, sondern ein String-Literal. Es ist jedoch speziell im Sinne dass Sie das aktuelle Datum erhalten, wenn Sie ein CAST() zu einem Datum / einer Zeit durchführen. 'YESTERDAY' unterscheided nicht zwischen Groß- und Kleinschreibung. Die Engine ignoriert führende oder nachstehende Leerzeichen beim Umwandeln. Siehe auch 'TODAY'.

Typ: CHAR(9)

Beispiele: 

select 'Yesterday' from rdb$database
		-- ergibt 'Tomorrow'
select cast('Yesterday as date) from rdb$database
		-- ergibt z.B. 2011-10-02
select cast('YESTERDAY' as timestamp) from rdb$database
		-- ergibt z.B. 2011-10-02 00:00:00.0000

Kurzschreibweisen für Casts von Datums- und Zeit-Datentypen für die letzten beiden Statements:

select date 'Yesterday' from rdb$database
		select timestamp 'YESTERDAY' from rdb$database

USER

Verfügbar in: DSQL, PSQL

Beschreibung: USER ist eine Kontextvariable, die den aktuellen Namen des derzeit verbundenen Benutzers vorhält. Es ist vollständig äquivalent zu CURRENT_USER .

Typ: VARCHAR(31)

Beispiel: 

create trigger bi_customers for customers before insert as
begin
  New.added_by  = USER;
  New.purchases = 0;
end
Zurück: Eingebaute Funktionen und VariablenFirebird Documentation IndexNach oben: Eingebaute Funktionen und VariablenWeiter: Skalarfunktionen
Firebird Documentation IndexFirebird 2.5 SprachreferenzEingebaute Funktionen und Variablen → Kontextvariablen