37. Контекстные переменные
В SQL РЕД База Данных существует четыре предварительно определенных литерала и множество контекстных переменных. Фактически все они неявно являются функциями. Обращение к предварительно определенному литералу или к контекстной переменной является обращением к соответствующей функции, определенной в системе управления базами данных, каждая из которых возвращает одно требуемое значение.
37.1. CURRENT_CONNECTION
Контекстная переменная CURRENT_CONNECTION имеет тип данных INTEGER.
Она возвращает число — системный идентификатор текущего соединения с базой данных.
Значение переменной хранится в странице заголовка базы и сбрасывается после восстановления базы.
Переменная увеличивается на единицу при каждом последующем соединении с базой данных (соединения также могут быть внутренними вызванными самим ядром).
Следовательно, переменная показывает количество подключений произошедших к базе после её восстановления (или после её создания).
Для обычных программ работы с базой данных эта переменная вряд ли может быть полезной.
37.2. CURRENT_DATE
CURRENT_DATE типа DATE возвращает текущую дату сервера.
37.3. CURRENT_ROLE
Контекстная переменная CURRENT_ROLE типа VARCHAR(63) возвращает имя роли, под которой с базой данных соединился пользователь в операторе CONNECT.
Если при соединении с базой данных роль не была указана, то возвращается пустое значение NONE.
37.4. CURRENT_TIME
CURRENT_TIME типа TIME WITH TIME ZONE возвращает текущее время сервера.
Время вычисляется в момент начала выполнения запроса и не меняется до его завершения.
Эта контекстная переменная возвращает не только время, но и тысячные доли секунды.
В обращении к контекстной переменной CURRENT_TIME можно указывать и количество знаков в требуемых долях секунды:
CURRENT_TIME [(<количество знаков в долях секунды>)]
Количество знаков может быть числом от 0 до 3. Если количество знаков не указано, предполагается 0.
37.5. CURRENT_TIMESTAMP
Контекстная переменная CURRENT_TIMESTAMP типа TIMESTAMP WITH TIME ZONE возвращает текущую дату и текущее время сервера.
Время вычисляется в момент начала выполнения запроса и не меняется до его завершения.
В текущем времени указываются и миллисекунды - три знака после десятичной точки.
При обращении к этой контекстной переменной также можно задавать требуемое количество долей секунды:
CURRENT_TIMESTAMP [(<количество знаков в долях секунды>)]
Количество знаков может быть числом от 0 до 3. Если количество знаков не указано, предполагается 3.
37.6. CURRENT_TRANSACTION
Контекстная переменная CURRENT_TRANSACTION типа INTEGER возвращает число - системный
идентификатор транзакции, под управлением которой выполняется текущий запрос.
Значение хранится в странице заголовка базы данных и сбрасывается в 0 после восстановления (или создания базы).
Оно увеличивается при старте новой транзакции.
Вряд ли это значение может быть полезно при использовании обычных средств SQL.
37.7. CURRENT_USER
CURRENT_USER типа VARCHAR(63) возвращает имя пользователя, который в настоящий момент соединен с базой данных.
Возвращаемое значение точно такое же, как и при использовании контекстной переменной USER.
37.8. DECFLOAT_ROUND
Контекстная переменная DECFLOAT_ROUND определяет режим округления, используемый в операциях со значениями DECFLOAT.
37.9. DECFLOAT_TRAPS
Контекстная переменная DECFLOAT_TRAPS определяет условия, приводящие к вызову исключений в операциях со значениями DECFLOAT.
37.10. INSERTING, UPDATING и DELETING
Контекстные переменные INSERTING, UPDATING и DELETING позволяют определить, какой тип операции с данными базы данных в настоящий момент выполняется.
Они возвращают значение TRUE, если выполняется, соответственно, оператор добавления новых данных, изменения существующих данных или удаления строк.
Эти переменные могут быть использованы только в табличных триггерах.
37.11. LOCALTIME
LOCALTIME типа TIME WITHOUT TIME ZONE возвращает текущее время сервера в часовом поясе сессии.
В обращении к контекстной переменной LOCALTIME можно указать количество знаков в долях секунды:
LOCALTIME [(<количество знаков в долях секунды>)]
Количество знаков может быть числом от 0 до 3. Если количество знаков не указано, предполагается 0.
37.12. LOCALTIMESTAMP
Контекстная переменная LOCALTIMESTAMP типа TIMESTAMP WITHOUT TIME ZONE возвращает текущую дату и текущее время сервера в часовом поясе сессии.
В текущем времени указываются и миллисекунды - три знака после десятичной точки.
При обращении к этой контекстной переменной можно задавать требуемое количество долей секунды:
LOCALTIMESTAMP [(<количество знаков в долях секунды>)]
Количество знаков может быть числом от 0 до 3. Если количество знаков не указано, предполагается 0.
37.13. NEW
Контекстная переменная NEW содержит новую версию записи базы данных, которая была вставлена или обновлена.
Эта переменная может быть использована только в табличных триггерах.
Примечание
Эта переменная в триггерах после события (AFTER) доступна только для чтения. Попытка записи в переменную NEW вызовет исключение.
Примечание
В триггерах на несколько типов событий контекстная переменная NEW доступна всегда.
Но при срабатывании триггера по событию DELETE новой версии записи не создаётся, т.е. чтение переменной NEW всегда будет возвращать значение NULL,
а запись в неё вызовет исключение времени выполнения.
См. также переменную OLD.
37.14. NOW
NOW является не переменной, а строковой константой. Однако, при её приведении (CAST()) к типу даты/времени, результатом будет текущая дата и/или время.
Точность составляет до миллисекунды. NOW нечувствительна к регистру и при приведении типов игнорируются начальные и конечные пробелы.
select CAST('NOW' as DATE) from rdb$database;
––––––––––––––––––––––––––––––––––––––––––––-
2024-07-03
select CAST('now' as TIMESTAMP) from rdb$database;
––––––––––––––––––––––––––––––––––––––––––––-
2024-07-03 12:45:19.4567
Примечание
При использовании приведения типов NOW всегда возвращает фактическую дату/время, даже в модулях PSQL,
где CURRENT_DATE, CURRENT_TIME и CURRENT_TIMESTAMP возвращают одно и то же значение вплоть до окончания выполнения кода.
Это делает NOW полезным для измерения временных интервалов в триггерах, процедурах и исполнимых блоках;
См. также переменные CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, TODAY.
37.15. OLD
Контекстная переменная OLD содержит существующую версию записи базы данных перед удалением или обновлением.
Эта переменная доступна только для чтения и только коде триггеров. Тип значения совпадает с типом данных строки.
Примечание
В триггерах на несколько типов событий контекстная переменная OLD доступна всегда.
Очевидно, что при срабатывании триггера по событию INSERT нет никакой существующей ранее версии записи.
В этой ситуации переменная OLD всегда будет возвращать NULL; попытка записи в неё вызовет исключение на этапе выполнения.
См. также переменную NEW.
37.16. ROW_COUNT
Контекстная переменная ROW_COUNT содержит количество строк, затронутых
(были прочитаны, добавлены, изменены или удалены) последним оператором DML (INSERT, UPDATE, DELETE, SELECT или FETCH) в текущем модуле PSQL.
ROW_COUNT нельзя использовать для определения количества строк, затронутых оператором EXECUTE STATEMENT или EXECUTE PROCEDURE.
Поведение при выполнении SELECT и FETCH:
После однократного
SELECTзначениеROW_COUNTравно 1, если был получен какой-либо набор данных, и 0 в противном случае.В цикле
FOR SELECTзначениеROW_COUNTувеличивается с каждой итерацией (начиная с 0 перед первым циклом).После
FETCHиз курсораROW_COUNTравен 1, если была получена строка данных, и 0 в противном случае. Получение большего количества записей из одного и того же курсора не делаетROW_COUNTбольше 1.
Пример:
update Figures set Number = 0 where id = :id;
if (row_count = 0) then
insert into Figures (id, Number) values (:id, 0);
37.17. SQLCODE, GDSCODE
Контекстные переменные SQLCODE и GDSCODE типа INTEGER позволяют получить значения соответствующих кодов ошибок базы данных.
Могут использоваться только в хранимых процедурах или триггерах в блоках обработки ошибок базы данных WHEN. За пределами таких блоков эти переменные имеют нулевое значение.
37.18. SQLSTATE
В SQL-2003 механизмом, передающим информацию об ошибке, является контекстная переменная состояния SQLSTATE.
Она представляет собой строку из пяти символов, в которой могут находиться буквы латинского алфавита в верхнем регистре и цифры.
Эта строка делится на две группы: двухсимвольный код класса и трехсимвольный код подкласса.
Вне обработчиков ошибок переменная SQLSTATE равна 00000, а вне PSQL не существует вообще.
SQLSTATE предназначен для замены SQLCODE.
Если в параметре SQLCODE код класса равен 00, оператор завершился успешно, если 01 - оператор вывел предупреждение, а 02 означает, что нет данных.
Любое другое значение кода класса означает, что выполнение оператора не было успешным.
Поскольку классы 00, 01 и 02 не вызывают ошибку, они никогда не будут обнаруживаться в переменной SQLSTATE.
WHEN ANY DO
BEGIN
ERR = CASE SQLSTATE
WHEN '2207' THEN 'Неверный формат даты и времени!'
WHEN '3D001' THEN 'Имя каталога не найдено!'
WHEN '42S22' THEN 'Столбец не найден!'
WHEN '22012' THEN 'Деление на ноль!'
ELSE 'Есть ошибка!'
END;
EXCEPTION EX_EXAMPLE ERR;
END
37.19. TODAY
Строковая константа TODAY типа CHAR(5). При её приведении (CAST()) к типу даты/времени, результатом будет текущая дата.
Написание 'TODAY' нечувствительна к регистру и при приведении типов игнорируются начальные и конечные пробелы.
37.20. TOMORROW
Строковая константа TOMORROW типа CHAR(8). При её приведении (CAST()) к типу даты/времени, результатом будет дата, следующая за текущей.
Написание 'TOMORROW' нечувствительна к регистру и при приведении типов игнорируются начальные и конечные пробелы.
37.21. USER
USER - имя пользователя, связанного с текущим экземпляром клиентской библиотеки.
Тип данных: VARCHAR(63). Это имя того же самого пользователя, которое может быть получено и при обращении к контекстной переменной CURRENT_USER.
37.22. YESTERDAY
Строковая константа YESTERDAY типа CHAR(9). При её приведении (CAST()) к типу даты/времени, результатом будет дата, которая была днем ранее.
Написание 'YESTERDAY' нечувствительна к регистру и при приведении типов игнорируются начальные и конечные пробелы.