FirebirdSQL logo

NEW

Verfügbar in

PSQL, nur Trigger

Typ

Datensatz

Syntax
NEW.column_name
Table 1. NEW-Parameter
Parameter Beschreibung

column_name

Spaltenname für den Zugriff

NEU enthält die neue Version eines Datenbankeintrags, der gerade eingefügt oder aktualisiert wurde.Ab Firebird 2.0 ist es in 'AFTER'-Triggern schreibgeschützt.

Note

Bei Multi-Action-Triggern — eingeführt in Firebird 1.5 — ist NEU immer verfügbar.Wird der Trigger jedoch durch ein DELETE ausgelöst, gibt es keine neue Version des Datensatzes.In dieser Situation wird beim Lesen von NEW immer NULL zurückgegeben;das Schreiben in sie führt zu einer Laufzeitausnahme.

'NOW'

Verfügbar in

DSQL, PSQL, ESQL

Typ

CHAR(3)

'NOW' ist keine Variable, sondern ein String-Literal oder eine Datums-/Uhrzeit-Mnemonik.Es ist jedoch in dem Sinne besonders, dass Sie, wenn Sie es in einen Datums-/Uhrzeittyp CAST() geben, das aktuelle Datum und/oder die aktuelle Uhrzeit erhalten.Seit Firebird 2.0 beträgt die Genauigkeit 3 Dezimalstellen, also Millisekunden. Bei 'NOW' wird die Groß-/Kleinschreibung nicht beachtet und die Engine ignoriert führende oder nachfolgende Leerzeichen beim Casting.

Note
Beispiele
select 'Now' from rdb$database
-- Ergebnis 'Now'

select cast('Now' as date) from rdb$database
-- Ergebnis z.B. 2008-08-13

select cast('now' as time) from rdb$database
-- Ergebnis z.B. 14:20:19.6170

select cast('NOW' as timestamp) from rdb$database
-- Ergebnis z.B. 2008-08-13 14:20:19.6170

docnext count = 18

OLD

Verfügbar in

PSQL, nur Trigger

Typ

Datensatz

Syntax
OLD.column_name
Table 1. OLD Parameters
Parameter Beschreibung

column_name

Spaltenname für den Zugriff

OLD enthält die vorhandene Version eines Datenbankeintrags kurz vor einer Löschung oder Aktualisierung.Ab Firebird 2.0 ist es schreibgeschützt.

Note

Bei Multi-Action-Triggern — eingeführt in Firebird 1.5 — ist 'OLD' immer verfügbar.Wenn der Trigger jedoch durch ein 'INSERT' ausgelöst wird, gibt es offensichtlich keine bereits vorhandene Version des Datensatzes.In dieser Situation wird beim Lesen von OLD immer NULL zurückgegeben;das Schreiben in sie führt zu einer Laufzeitausnahme.

RESETTING

Available in

PSQL

Type

BOOLEAN

Syntax
RESETTING

Nur in Triggern verfügbar, RESETTING zeigt an, ob der Trigger während eines Sitzungs-Resets ausgelöst wurde.Sein Wert ist TRUE, wenn das Zurücksetzen der Sitzung im Gange ist, andernfalls FALSE.Vorgesehen für die Verwendung in ON DISCONNECT- und ON CONNECT-Datenbank-Triggern, um einen ALTER SESSION RESET zu erkennen.

ROW_COUNT

Verfügbar in

PSQL

Typ

INTEGER

Syntax
ROW_COUNT

Die Kontextvariable ROW_COUNT enthält die Anzahl der Zeilen, die von der letzten DML-Anweisung (INSERT, UPDATE, DELETE, SELECT oder FETCH) im aktuellen Trigger, in der gespeicherten Prozedur oder im ausführbaren Block betroffen sind.

Verhalten bei SELECT und FETCH
  • Nach einem Singleton SELECT ist ROW_COUNT 1, wenn eine Datenzeile abgerufen wurde, andernfalls 0.

  • In einer FOR SELECT Schleife wird ROW_COUNT bei jeder Iteration inkrementiert (beginnend bei 0 vor der ersten).

  • Nach einem FETCH von einem Cursor ist ROW_COUNT 1, wenn eine Datenzeile abgerufen wurde, andernfalls 0.Wenn mehr Datensätze vom gleichen Cursor abgerufen werden, wird ROW_COUNT nicht über 1 hinaus erhöht.

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

Note

ROW_COUNT kann nicht verwendet werden, um die Anzahl der Zeilen zu bestimmen, die von einem EXECUTE STATEMENT- oder EXECUTE PROCEDURE-Befehl betroffen sind.

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

SQLCODE

Verfügbar in

PSQL

Eingestellt in

2.5.1

Typ

INTEGER

Syntax
SQLCODE

In einem “WHEN …​ DO”-Fehlerbehandlungsblock enthält die Kontextvariable SQLCODE den aktuellen SQL-Fehlercode.Vor Firebird 2.0 wurde SQLCODE nur in den WHEN SQLCODE- und WHEN ANY-Handlern gesetzt.Sie darf jetzt auch in den Blöcken WHEN GDSCODE, WHEN SQLSTATE und WHEN EXCEPTION ungleich Null sein, sofern die fehlerauslösende Bedingung einem SQL-Fehlercode entspricht.Außerhalb von Fehlerhandlern ist SQLCODE immer 0.Außerhalb von PSQL existiert es überhaupt nicht.

Warning

SQLCODE wird nun zugunsten des SQL-2003-kompatiblen Statuscodes [fblangref40-contextvars-sqlstate-de] veraltet.Die Unterstützung für SQLCODE und WHEN SQLCODE wird in einer zukünftigen Version von Firebird eingestellt.

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

SQLSTATE

Verfügbar in

PSQL

Typ

CHAR(5)

Syntax
SQLSTATE

In einer “WHEN …​ DO”-Fehlerbehandlung enthält die Kontextvariable SQLSTATE den 5-stelligen, SQL-2003-konformen Statuscode, der sich aus der Anweisung ergibt, die den Fehler ausgelöst hat.Außerhalb von Fehlerhandlern ist SQLSTATE immer '00000'.Außerhalb von PSQL ist es überhaupt nicht verfügbar.

Note
  • 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 innerhalb des Handlers 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 ein Exception.Da die Klassen 00, 01 und 02 keinen Fehler auslösen, werden sie niemals in der Variablen SQLSTATE angezeigt.

  • Eine vollständige Liste der SQLSTATE-Codes finden Sie im Abschnitt SQLSTATE-Codes und Nachrichtentexte in Anhang B: Ausnahmebehandlung, Codes und Nachrichten.

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

CURRENT_DATE

Verfügbar in

DSQL, PSQL, ESQL

Typ

DATE

Syntax
CURRENT_DATE

CURRENT_DATE gibt das aktuelle Serverdatum zurück.

Note

Innerhalb eines PSQL-Moduls (Prozedur, Trigger oder ausführbarer Block) bleibt der Wert von CURRENT_DATE bei jedem Lesen konstant.Wenn mehrere Module sich gegenseitig aufrufen oder auslösen, bleibt der Wert während der Dauer des äußersten Moduls konstant.Wenn Sie einen fortlaufenden Wert in PSQL benötigen (z. B. um Zeitintervalle zu messen), verwenden Sie [fblangref40-contextvars-today-de].

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

'TODAY'

Verfügbar in

DSQL, PSQL, ESQL

Typ

CHAR(5)

'TODAY' ist keine Variable, sondern ein String-Literal oder ein Datumsmnemonik.Es ist jedoch in dem Sinne besonders, dass Sie, wenn Sie es in einen Datums-/Uhrzeittyp CAST() geben, das aktuelle Datum erhalten.Bei 'TODAY' wird die Groß-/Kleinschreibung nicht beachtet und die Engine ignoriert führende oder nachfolgende Leerzeichen beim Casting.

Note
  • 'TODAY' Ergebnis immer das aktuelle Datum, auch in PSQL-Modulen, wo [fblangref40-contextvars-current-date-de], [fblangref40-contextvars-current-time-de] und [fblangref40-contextvars-current-timestamp-de] gibt während der gesamten Dauer der äußersten Routine denselben Wert zurück.Dies macht 'TODAY' nützlich, um Zeitintervalle in Triggern, Prozeduren und ausführbaren Blöcken zu messen (zumindest wenn Ihre Prozeduren tagelang laufen).

  • Außer in der oben erwähnten Situation ist das Lesen von CURRENT_DATE im Allgemeinen vorzuziehen, 'TODAY' zu gießen.

  • Firebird 3.0 und früher erlaubten die Verwendung von 'TODAY' in Datetime-Literalen (auch bekannt als "`shorthand casts"`), dies ist in Firebird 4.0 nicht mehr erlaubt.

Beispiele
select 'Today' from rdb$database
-- Ergebnis 'Today'

select cast('Today' as date) from rdb$database
-- Ergebnis z.B. 2011-10-03

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

'TOMORROW'

Verfügbar in

DSQL, PSQL, ESQL

Typ

CHAR(8)

'TOMORROW' ist keine Variable, sondern ein String-Literal.Es ist jedoch in dem Sinne besonders, dass Sie, wenn Sie es in einen Datums-/Uhrzeittyp CAST() geben, das Datum des nächsten Tages erhalten.Siehe auch [fblangref40-contextvars-today-de].

Beispiele
select 'Tomorrow' from rdb$database
-- Ergebnis 'Tomorrow'

select cast('Tomorrow' as date) from rdb$database
-- Ergebnis z.B. 2011-10-04

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

UPDATING

Verfügbar in

PSQL

Typ

BOOLEAN

Syntax
UPDATING

Nur in Triggern verfügbar, 'UPDATING' zeigt an, ob der Trigger aufgrund einer 'UPDATE'-Operation ausgelöst wurde.Vorgesehen für die Verwendung in Multi-Action-Trigger.

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

Typ

CHAR(9)

'YESTERDAY' ist keine Variable, sondern ein String-Literal.Es ist jedoch in dem Sinne besonders, dass Sie, wenn Sie es in einen Datums-/Uhrzeittyp CAST() geben, das Datum des Vortages erhalten.Siehe auch [fblangref40-contextvars-today-de].

Beispiele
select 'Yesterday' from rdb$database
-- Ergebnis 'Yesterday'

select cast('Yesterday as date) from rdb$database
-- Ergebnis z.B. 2011-10-02

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

USER

Verfügbar in

DSQL, PSQL

Typ

VARCHAR(63)

Syntax
USER

USER ist eine Kontextvariable, die den Namen des aktuell verbundenen Benutzers enthält.Es entspricht vollständig [fblangref40-contextvars-current-user-de].

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

CURRENT_ROLE

Verfügbar in

DSQL, PSQL

Typ

VARCHAR(63)

Syntax
CURRENT_ROLE

CURRENT_ROLE ist eine Kontextvariable, die die explizit angegebene Rolle des aktuell verbundenen Benutzers enthält.Wenn keine explizit angegebene Rolle vorhanden ist, ist CURRENT_ROLE 'NONE'.

CURRENT_ROLE repräsentiert immer eine gültige Rolle oder 'NONE'.Wenn sich ein Benutzer mit einer nicht vorhandenen Rolle verbindet, setzt die Engine sie stillschweigend auf "NONE" zurück, ohne einen Fehler zurückzugeben.

Note

Rollen, die standardmäßig aktiv sind und nicht explizit beim Verbinden oder Verwenden von SET ROLE angegeben sind, werden von CURRENT_ROLE nicht zurückgegeben.Verwenden Sie RDB$ROLE_IN_USE, um nach allen aktiven Rollen zu suchen.

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

RDB$ROLE_IN_USE

CURRENT_TIME

Verfügbar in

DSQL, PSQL, ESQL

Typ

TIME WITH TIME ZONE

Caution

Der Datentyp wurde in Firebird 4.0 von TIME WITHOUT TIME ZONE in TIME WITH TIME ZONE geändert.Verwenden Sie [fblangref40-contextvars-localtime-de], um TIME WITHOUT TIME ZONE zu erhalten.

Syntax
CURRENT_TIME [ (<precision>) ]

<precision> ::= 0 | 1 | 2 | 3

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

Table 1. CURRENT_TIME Parameter
Parameter Beschreibung

precision

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

CURRENT_TIME gibt die aktuelle Serverzeit in der Sitzungszeitzone zurück.Der Standardwert ist 0 Dezimalstellen, d. h. Sekundengenauigkeit.

Note
  • CURRENT_TIME hat eine Standardgenauigkeit von 0 Dezimalstellen, wobei CURRENT_TIMESTAMP eine Standardgenauigkeit von 3 Dezimalstellen hat.Daher ist CURRENT_TIMESTAMP nicht die genaue Summe von CURRENT_DATE und CURRENT_TIME, es sei denn, Sie geben explizit eine Genauigkeit an (d. h. CURRENT_TIME(3) oder CURRENT_TIMESTAMP(0)).

  • Innerhalb eines PSQL-Moduls (Prozedur, Trigger oder ausführbarer Block) bleibt der Wert von CURRENT_TIME bei jedem Lesen konstant.Wenn mehrere Module sich gegenseitig aufrufen oder auslösen, bleibt der Wert während der Dauer des äußersten Moduls konstant.Wenn Sie einen fortlaufenden Wert in PSQL benötigen (z. B. um Zeitintervalle zu messen), verwenden Sie [fblangref40-contextvars-now-de].

Warning
CURRENT_TIME und Firebird 4.0 Zeitzonenunterstützung

Firebird 4.0 hat Unterstützung für Zeitzonen hinzugefügt.Als Teil dieser Unterstützung wurde eine Inkompatibilität mit dem CURRENT_TIME-Ausdruck im Vergleich zur vorherigen Version eingeführt.

In Firebird 4.0 gibt CURRENT_TIME den Typ TIME WITH TIME ZONE zurück.Damit Ihre Abfragen mit dem Datenbankcode von Firebird 4.0 und höher kompatibel sind, haben Firebird 3.0.4 und Firebird 2.5.9 den Ausdruck [fblangref40-contextvars-localtime-de] eingeführt.In Firebird 3.0.4 und Firebird 2.5.9 ist LOCALTIME ein Synonym für CURRENT_TIME.

In Firebird 4.0 funktioniert LOCALTIME weiterhin wie in Firebird 3.0.4 und höher und Firebird 2.5.9 (gibt TIME [WITHOUT TIME ZONE] zurück), während CURRENT_TIME jetzt einen anderen Datentyp zurückgibt, TIME WITH TIMEZONE.

Beispiele
select current_time from rdb$database
-- Ergebnis z.B. 14:20:19.0000

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

CURRENT_TIMESTAMP

Verfügbar in

DSQL, PSQL, ESQL

Typ

TIMESTAMP WITH TIME ZONE

Caution

Der Datentyp wurde in Firebird 4.0 von TIMESTAMP WITHOUT TIME ZONE in TIMESTAMP WITH TIME ZONE geändert.Verwenden Sie [fblangref40-contextvars-localtimestamp-de], um TIMESTAMP WITHOUT TIME ZONE zu erhalten.

Syntax
CURRENT_TIMESTAMP [ (<precision>) ]

<precision> ::= 0 | 1 | 2 | 3

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

Table 1. CURRENT_TIMESTAMP Parameter
Parameter Beschreibung

precision

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

CURRENT_TIMESTAMP gibt das aktuelle Serverdatum und die aktuelle Uhrzeit in der Sitzungszeitzone zurück.Der Standardwert ist 3 Dezimalstellen, d. h. Millisekunden-Genauigkeit.

Note
  • Die Standardgenauigkeit von CURRENT_TIME beträgt 0 Dezimalstellen, also ist CURRENT_TIMESTAMP nicht die genaue Summe von CURRENT_DATE und CURRENT_TIME, es sei denn, Sie geben explizit eine Genauigkeit an (zB CURRENT_TIME(3) oder `CURRENT_TIMESTAMP(0) `).

  • Innerhalb eines PSQL-Moduls (Prozedur, Trigger oder ausführbarer Block) bleibt der Wert von CURRENT_TIMESTAMP bei jedem Lesen konstant.Wenn mehrere Module sich gegenseitig aufrufen oder auslösen, bleibt der Wert während der Dauer des äußersten Moduls konstant.Wenn Sie einen fortlaufenden Wert in PSQL benötigen (z. B. um Zeitintervalle zu messen), verwenden Sie [fblangref40-contextvars-now-de].

Warning
CURRENT_TIMESTAMP und Firebird 4 Zeitzonenunterstützung

Firebird 4.0 hat Unterstützung für Zeitzonen hinzugefügt.Im Rahmen dieser Unterstützung wurde im Vergleich zu früheren Versionen eine Inkompatibilität mit dem CURRENT_TIMESTAMP-Ausdruck eingeführt.

In Firebird 4.0 gibt CURRENT_TIMESTAMP den Typ TIMESTAMP WITH TIME ZONE zurück.Damit Ihre Abfragen mit dem Datenbankcode von Firebird 4.0 und höher kompatibel sind, haben Firebird 3.0.4 und Firebird 2.5.9 den Ausdruck [fblangref40-contextvars-localtimestamp-de] eingeführt.In Firebird 3.0.4 und Firebird 2.5.9 ist LOCALTIMESTAMP ein Synonym für CURRENT_TIMESTAMP.

In Firebird 4.0 funktioniert LOCALTIMESTAMP weiterhin wie in Firebird 3.0.4 und höher und Firebird 2.5.9 (gibt TIMESTAMP [WITHOUT TIME ZONE] zurück), während CURRENT_TIMESTAMP jetzt einen anderen Datentyp zurückgibt, TIMESTAMP MIT ZEITZONE.

Beispiele
select current_timestamp from rdb$database
-- Ergebnis z.B. 2008-08-13 14:20:19.6170

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

CURRENT_TRANSACTION

Verfügbar in

DSQL, PSQL

Typ

BIGINT

Syntax
CURRENT_TRANSACTION

CURRENT_TRANSACTION enthält die eindeutige Kennung der aktuellen Transaktion.

Sein Wert wird von einem Zähler auf der Kopfseite der Datenbank abgeleitet, der bei jeder neuen Transaktion inkrementiert wird.Wenn eine Datenbank wiederhergestellt wird, wird dieser Zähler auf Null zurückgesetzt.

Beispiele
select current_transaction from rdb$database

New.Txn_ID = current_transaction;

CURRENT_USER

Verfügbar in

DSQL, PSQL

Typ

VARCHAR(63)

Syntax
CURRENT_USER

CURRENT_USER ist eine Kontextvariable, die den Namen des aktuell verbundenen Benutzers enthält.Es ist völlig äquivalent zu [fblangref40-contextvars-user-de].

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

Typ

BOOLEAN

Syntax
DELETING

Nur in Triggern verfügbar, DELETING zeigt an, ob der Trigger für eine DELETE-Operation ausgelöst wurde.Vorgesehen für die Verwendung in multi-action triggers-de.

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

Typ

INTEGER

Syntax
GDSCODE

In einem “WHEN …​ DO”-Fehlerbehandlungsblock enthält die Kontextvariable GDSCODE die numerische Darstellung des aktuellen Firebird-Fehlercodes.Vor Firebird 2.0 wurde GDSCODE nur in WHEN GDSCODE-Handlern gesetzt.Jetzt kann es auch in den Blöcken WHEN ANY, WHEN SQLCODE, WHEN SQLSTATE und WHEN EXCEPTION ungleich Null sein, vorausgesetzt, die den Fehler auslösende Bedingung entspricht einem Firebird-Fehlercode.Außerhalb von Fehlerhandlern ist GDSCODE immer 0.Außerhalb von PSQL existiert es überhaupt nicht.

Note

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

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