DSQL, PSQL
CURRENT_CONNECTION
BIGINT
Переменная CURRENT_CONNECTION
хранит уникальный идентификатор текущего соединения.
Значение переменной хранится в странице заголовка базы и сбрасывается после restore.
Переменная увеличивается на единицу при каждом последующем соединении с базой данных (соединения также могут быть внутренними вызванными самим ядром). Следовательно, переменная показывает количество подключений произошедших к базе после её восстановления (или после её создания).
CURRENT_CONNECTION
SELECT CURRENT_CONNECTION FROM RDB$DATABASE
DSQL, PSQL, ESQL
CURRENT_DATE
DATE
Переменная CURRENT_DATE
возвращает текущую дату сервера.
Note
|
В модуле PSQL (процедура, функция, триггер или исполняемый блок) значение |
CURRENT_DATE
select current_date from rdb$database
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
|
Такое же значение можно будет получить и в результате выполнения запроса: SELECT RDB$GET_CONTEXT ('SYSTEM', 'CURRENT_ROLE')
FROM RDB$DATABASE; |
DSQL, PSQL, ESQL
CURRENT_TIME [(<precision>)] <precision> ::= 0 | 1 | 2 | 3
CURRENT_TIME
Параметр | Описание |
---|---|
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
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
DSQL, PSQL
CURRENT_TRANSACTION
BIGINT
Переменная CURRENT_TRANSACTION
содержит уникальный номер текущей транзакции.
Значение `CURRENT_TRANSACTION
хранится в странице заголовка базы данных и сбрасывается в 0 после восстановления (или создания базы). Оно увеличивается при старте новой транзакции.
CURRENT_TRANSACTION
SELECT CURRENT_TRANSACTION FROM RDB$DATABASE;
NEW.TRANS_ID = CURRENT_TRANSACTION;
DSQL, PSQL
CURRENT_USER
VARCHAR(63)
Переменная CURRENT_USER
содержит имя текущего подключенного пользователя базы данных.
CURRENT_USER
NEW.ADDED_BY = CURRENT_USER;
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
...
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
|
Обратите внимание, пожалуйста: после, |
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
...
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
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
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;
...
NEW
.
PSQL
RESETTING
BOOLEAN
Контекстная переменная RESETTING
доступна только коде триггеров на события ON CONNECT
и ON DISCONNECT
, и может использоваться в любом месте, где можно использовать логический предикат.
Системная переменная RESETTING
, позволяет обнаружить случай, когда триггер базы данных срабатывает из-за сброса сеанса, например с помощью оператора ALTER SESSION RESET
.
Её значение TRUE
, если выполняется сброс сеанса, и FALSE
в противном случае.
RESETTING
...
IF (RESETTING) THEN
BEGIN
-- выполняется сброс сеанса
END
...
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
|
Не используйте переменную ...
UPDATE t2 SET
evt='upd',
old_id = old.id, old_x = old.x,
new_id = new.id, new_x = new.x
WHERE new_id = old.id;
INSERT INTO t2log(evt, affected_rows) VALUES('upd', ROW_COUNT);
... В вышеприведённом примере в столбец ...
DECLARE rc INT;
...
UPDATE t2 SET
evt='upd',
old_id = old.id, old_x = old.x,
new_id = new.id, new_x = new.x
WHERE new_id = old.id;
rc = ROW_COUNT;
INSERT INTO t2log(evt, affected_rows) VALUES('upd', rc);
... |
ROW_COUNT
...
UPDATE Figures SET Number = 0 WHERE id = :id;
IF (row_count = 0) THEN
INSERT INTO Figures (id, Number)
VALUES (:id, 0);
...
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
...
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
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
...
DSQL, PSQL
USER
VARCHAR(63)
Переменная USER
содержит имя текущего подключенного пользователя базы данных.
USER
NEW.ADDED_BY = USER;