CURRENT_CONNECTION
DSQL, PSQL
CURRENT_CONNECTION
BIGINT
Переменная CURRENT_CONNECTION
хранит уникальный идентификатор текущего соединения.Значение переменной хранится в странице заголовка базы и сбрасывается после restore.Переменная увеличивается на единицу при каждом последующем соединении с базой данных (соединения также могут быть внутренними вызванными самим ядром). Следовательно, переменная показывает количество подключений произошедших к базе после её восстановления (или после её создания).
CURRENT_CONNECTION
SELECT CURRENT_CONNECTION FROM RDB$DATABASE
INSERTING
PSQL
INSERTING
BOOLEAN
Контекстная переменная INSERTING
доступна только коде табличных триггеров.Используется в триггерах на несколько типов событий и показывает, что триггер сработал при выполнении операции INSERT
.
INSERTING
...
IF (INSERTING OR UPDATING) THEN
BEGIN
IF (NEW.SERIAL_NUM IS NULL) THEN
NEW.SERIAL_NUM = GEN_ID (GEN_SERIALS, 1);
END
...
LOCALTIME
DSQL, PSQL, ESQL
LOCALTIME [(<precision>)] <precision> ::= 0 | 1 | 2 | 3
Параметр | Описание |
---|---|
precision |
Точность.Значение по умолчанию 0.Не поддерживается в ESQL. |
TIME WITHOUT TIME ZONE
Переменная LOCALTIME
возвращает текущее время в часовом поясе сессии, без информации о часовом поясе.Точность определяет, сколько учитывать знаков после запятой в долях секунды.Точность по умолчанию равна 0.
Note
|
В блоке кода PSQL (процедура, триггер, исполняемый блок) значение |
LOCALTIME
SELECT LOCALTIME(2) FROM RDB$DATABASE;
-- результат будет (например) 23:35:33.1200
LOCALTIMESTAMP
DSQL, PSQL, ESQL
LOCALTIMESTAMP [(<precision>)] <precision> ::= 0 | 1 | 2 | 3
Параметр | Описание |
---|---|
precision |
Точность.Значение по умолчанию 3.Не поддерживается в ESQL. |
TIMESTAMP WITHOUT TIME ZONE
Переменная LOCALTIMESTAMP
возвращает текущую дату и время в часовом поясе сессии, без информации о часовом поясе.Точность определяет, сколько учитывать знаков после запятой в долях секунды.Точность по умолчанию равна 3.
Note
|
В блоке кода PSQL (процедура, триггер, исполняемый блок) значение |
LOCALTIMESTAMP
SELECT LOCALTIMESTAMP(2) FROM RDB$DATABASE;
-- результат будет (например) 02.03.2014 23:35:33.1200
NEW
PSQL
NEW
Контекстная переменная NEW
доступна только в коде табличных триггеров.Значение NEW
содержит новые значения полей данных, которое возникли в базе во время операции обновления или вставки.
В AFTER
триггерах переменная доступна только для чтения.
Note
|
Для табличных триггеров, срабатывающих на несколько типов событий, переменная |
Important
|
Попытка записи в переменную |
NEW
...
IF (NEW.SERIAL_NUM IS NULL) THEN
NEW.SERIAL_NUM = GEN_ID (GEN_SERIALS, 1);
...
OLD
PSQL
OLD
Контекстная переменная OLD
доступна только коде триггеров.Значения, содержащееся в OLD
, хранит прошлые значения полей, которые были в базе до операции изменения или удаления.
Переменная OLD
доступна только для чтения.
Note
|
Для табличных триггеров, срабатывающих на несколько типов событий, значения для переменной |
OLD
...
IF (NEW.QUANTITY IS DISTINCT FROM OLD.QUANTITY) THEN
DELTA = NEW.QUANTITY - OLD.QUANTITY;
...
RESETTING
PSQL
RESETTING
BOOLEAN
Контекстная переменная RESETTING
доступна только коде триггеров на события ON CONNECT
и ON DISCONNECT
, и может использоваться в любом месте, где можно использовать логический предикат.Системная переменная RESETTING
, позволяет обнаружить случай, когда триггер базы данных срабатывает из-за сброса сеанса, например с помощью оператора ALTER SESSION RESET
.Её значение TRUE
, если выполняется сброс сеанса, и FALSE
в противном случае.
RESETTING
...
IF (RESETTING) THEN
BEGIN
-- выполняется сброс сеанса
END
...
ROW_COUNT
PSQL
ROW_COUNT
BIGINT
Контекстная переменная ROW_COUNT
содержит число строк, затронутых последним оператором DML(INSERT
, UPDATE
, DELETE
, SELECT
или FETCH
) в текущем триггере, хранимой процедуре или исполняемом блоке.
Поведение с SELECT
и FETCH
:
После выполнения singleton SELECT
запроса (запроса, который может вернуть не более одной строки данных),ROW_COUNT
равна 1, если была получена строка данных и 0 в противном случае;
В цикле FOR SELECT
переменная ROW_COUNT
увеличивается на каждой итерации (начиная с 0 в качестве первого значения);
После выборки (FETCH
) из курсора, ROW_COUNT
равна 1, если была получена строка данных и 0 в противном случае. Выборка нескольких записей из одного курсора не увеличивает ROW_COUNT
после 1.
Important
|
Переменная |
Warning
|
Не используйте переменную
В вышеприведённом примере в столбец
|
ROW_COUNT
...
UPDATE Figures SET Number = 0 WHERE id = :id;
IF (row_count = 0) THEN
INSERT INTO Figures (id, Number)
VALUES (:id, 0);
...
SQLCODE
PSQL
SQLCODE
INTEGER
В блоках обработки ошибок WHEN … DO
контекстная переменная SQLCODE
содержит текущий код ошибки SQL.До Firebird 2.0 значение SQLCODE
можно было получить только в блоках обработки ошибок WHEN SQLCODE и WHEN ANY.Теперь она может быть отлична от нуля в блоках WHEN GDSCODE
и WHEN EXCEPTION
при условии, что ошибка, вызвавшее срабатывание блока, соответствует коду ошибки SQL.Вне обработчиков ошибок SQLCODE
всегда равен 0, а вне PSQL не существует вообще.
SQLCODE
...
WHEN ANY DO
BEGIN
IF (SQLCODE <> 0) THEN
MSG = 'Обнаружена ошибка SQL!';
ELSE
MSG = 'Ошибки нет!';
EXCEPTION EX_CUSTOM MSG;
END
...
SQLSTATE
PSQL
SQLSTATE
CHAR(5)
В блоках обработки ошибок WHEN … DO
контекстная переменная SQLSTATE
переменная содержит 5 символов SQL-2003 — совместимого кода состояния, переданного оператором, вызвавшим ошибку.Вне обработчиков ошибок SQLSTATE
всегда равен '00000', а вне PSQL не существует вообще.
Note
|
|
SQLSTATE
WHEN ANY DO
BEGIN
MSG = CASE SQLSTATE
WHEN '22003' THEN
'Число вышло за пределы диапазона!'
WHEN '22012' THEN
'Деление на ноль!'
WHEN '23000' THEN
'Нарушение ограничения целостности!'
ELSE 'Ошибок нет! SQLSTATE = ' || SQLSTATE;
END;
EXCEPTION EX_CUSTOM MSG;
END
UPDATING
PSQL
UPDATING
BOOLEAN
Контекстная переменная UPDATING
доступна только коде табличных триггеров.Используется в триггерах на несколько типов событий и показывает, что триггер сработал при выполнении операции UPDATE
.
UPDATING
...
IF (INSERTING OR UPDATING) THEN
BEGIN
IF (NEW.SERIAL_NUM IS NULL) THEN
NEW.SERIAL_NUM = GEN_ID (GEN_SERIALS, 1);
END
...
CURRENT_DATE
DSQL, PSQL, ESQL
CURRENT_DATE
DATE
Переменная CURRENT_DATE
возвращает текущую дату сервера.
Note
|
В модуле PSQL (процедура, функция, триггер или исполняемый блок) значение |
CURRENT_DATE
select current_date from rdb$database
USER
DSQL, PSQL
USER
VARCHAR(63)
Переменная USER
содержит имя текущего подключенного пользователя базы данных.
USER
NEW.ADDED_BY = USER;
CURRENT_ROLE
DSQL, PSQL
CURRENT_ROLE
VARCHAR(63)
Контекстная переменная CURRENT_ROLE
, содержащая имя роли, которая была указана при подключении к базе данных, илироль установленную с помощью оператора SET ROLE
. В случае если произошло подключение без указания роли,и роль не была указана позже с помощью оператора SET ROLE
, переменная принимает значение NONE
.
CURRENT_ROLE
всегда представляет допустимую роль или NONE
. Если пользователь подключается с несуществующей ролью,ядро молча сбрасывает её на NONE
, не возвращая ошибку.
Note
|
Контекстная переменная |
CURRENT_ROLE
SELECT CURRENT_ROLE FROM RDB$DATABASE
Note
|
Такое же значение можно будет получить и в результате выполнения запроса:
|
CURRENT_TIME
DSQL, PSQL, ESQL
CURRENT_TIME [(<precision>)] <precision> ::= 0 | 1 | 2 | 3
Параметр | Описание |
---|---|
precision |
Точность.Значение по умолчанию 0.Не поддерживается в ESQL. |
TIME WITH TIME ZONE
Переменная CURRENT_TIME
возвращает текущее время в часовом поясе сессии, включая информацию о часовом поясе.Точность определяет, сколько учитывать знаков после запятой в долях секунды.По умолчанию точность равна 0.
Note
|
В блоке кода PSQL (процедура, триггер, исполняемый блок) значение |
CURRENT_TIME
SELECT CURRENT_TIME(2) FROM RDB$DATABASE;
-- результат будет (например) 23:35:33.1200 Europe/Moscow
CURRENT_TIMESTAMP
DSQL, PSQL, ESQL
CURRENT_TIMESTAMP [(<precision>)] <precision> ::= 0 | 1 | 2 | 3
Параметр | Описание |
---|---|
precision |
Точность.Значение по умолчанию 3.Не поддерживается в ESQL. |
TIMESTAMP WITH TIME ZONE
Переменная CURRENT_TIMESTAMP
возвращает текущую дату и время в часовом поясе сессии, включая информацию о часовом поясе.Точность определяет, сколько учитывать знаков после запятой в долях секунды.Точность по умолчанию равна 3.
Note
|
В блоке кода PSQL (процедура, триггер, исполняемый блок) значение |
CURRENT_TIMESTAMP
SELECT CURRENT_TIMESTAMP(2) FROM RDB$DATABASE;
-- результат будет (например) 02.03.2014 23:35:33.1200 Europe/Moscow
CURRENT_TRANSACTION
DSQL, PSQL
CURRENT_TRANSACTION
BIGINT
Переменная CURRENT_TRANSACTION
содержит уникальный номер текущей транзакции.
Значение `CURRENT_TRANSACTION
хранится в странице заголовка базы данных и сбрасывается в 0 после восстановления (или создания базы). Оно увеличивается при старте новой транзакции.
CURRENT_TRANSACTION
SELECT CURRENT_TRANSACTION FROM RDB$DATABASE;
NEW.TRANS_ID = CURRENT_TRANSACTION;
CURRENT_USER
DSQL, PSQL
CURRENT_USER
VARCHAR(63)
Переменная CURRENT_USER
содержит имя текущего подключенного пользователя базы данных.
CURRENT_USER
NEW.ADDED_BY = CURRENT_USER;
DELETING
PSQL
DELETING
BOOLEAN
Контекстная переменная DELETING
доступна только в коде табличных триггеров.Используется в триггерах на несколько типов событий и показывает, что триггер сработал при выполнении операции DELETE
.
DELETING
...
IF (DELETING) THEN
BEGIN
INSERT INTO REMOVED_CARS (
ID, MAKE, MODEL, REMOVED)
VALUES (
OLD.ID, OLD.MAKE, OLD.MODEL, CURRENT_TIMESTAMP);
END
...
GDSCODE
PSQL
GDSCODE
INTEGER
В блоке обработки ошибок WHEN … DO
контекстная переменная GDSCODE
содержит числовое представление текущего кода ошибки Firebird.До версии Firebird 2.0 GDSCODE
можно было получить только с использованием конструкции WHEN GDSCODE
.Теперь эту контекстную переменную можно также использовать в блоках WHEN ANY
, WHEN SQLCODE
и WHEN EXCEPTION
при условии, что код ошибки соответствует коду ошибки Firebird.Вне обработчика ошибок GDSCODE
всегда равен 0.Вне PSQL GDSCODE
не существует вообще.
GDSCODE
...
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
...
Note
|
Обратите внимание, пожалуйста: после, |