RDB$GET_CONTEXT
Версии сервера
| 0.9 | 1.0 | 1.5.3 | 1.5.4 | 1.5.5 | 2.0 | 2.0.3 | 2.0.4 | 2.1 | 2.5 | 3.0 |
|---|---|---|---|---|---|---|---|---|---|---|
| - | - | - | - | - | Да | Да | Да | Да | Да | Да |
Формат
RDB$GET_CONTEXT( “пространство имён”, переменная)
Описание
Встроенная функция Дает доступ к информации о текущем подключении и текущей транзакции. Так же позволяет получать пользовательские переменые внутри транзакции или подключения заданые с помощью RDB$SET_CONTEXT.
⚠️ “Пространства имен” и переменые являются регистро зависимыми
⚠️ Для продотвращения DoS атак, существует ограничение на 1000 переменых в одном “пространстве имен”.
RDB$GET_CONTEXT возращает текущее значение переменой, если переменой нет то возращается NULL.
в настоящий момент есть всего 3 “пространства имен” которые можно использовать:
USER_SESSION для пользовательских переменых, заданые через RDB$SET_CONTEXT в течении подключения.
USER_TRANSACTION для пользовательских переменых, заданые через RDB$SET_CONTEXT в течении транзакции.
SYSTEM предостовляют доступ к определеным переменым, описанных в следующей таблице
| Переменая | описание | возможное значение |
|---|---|---|
| ENGINE_VERSION | Возвращает текущую версию SQL-сервера | Например, “2.5.0” |
| NETWORK_PROTOCOL | Сетевой протокол, используемый клиентом. | “TCPv4”, “WNET”, “XNET” , NULL |
| CLIENT_ADDRESS | Сетевой адрес клиента | для TCPv4 - “xxx.xxx.xxx.xxx”, для XNET - ID процесса, для остальных NULL |
| DB_NAME | Имя базы данных, в зависимости от подключения возвращает алиас или путь к файлу, указанные в строке подключения к базе данных. | |
| ISOLATION_LEVEL | Уровень изолированности текущей транзакции. | “READ COMMITTED”, “CONSISTENCY”, “SNAPSHOT” |
| READ_ONLY | Режим транзакции для чтения с 2.5.3 или 2.5.2 | “TRUE”, “FALSE” |
| TRANSACTION_ID | Номер текущей транзакции, тоже самое что CURRENT_TRANSACTION | |
| SESSION_ID | Номер текущего подключения, тоже самое что CURRENT_CONNECTION | |
| CURRENT_USER | Текущий пользователь, тоже самое что CURRENT_USER | |
| CURRENT_ROLE | Текущая роль, тоже самое что CURRENT_ROLE |
Пример
-- Получить текущую версию сервера
SELECT RDB$GET_CONTEXT('SYSTEM','ENGINE_VERSION') FROM RDB$DATABASE
-- Создание пользовательской переменной в рамках контекста
SELECT RDB$SET_CONTEXT('USER_SESSION','MY','Значение Моей Переменной') FROM RDB$DATABASE
-- Получить потом значение этой переменной
SELECT RDB$GET_CONTEXT('USER_SESSION','MY') FROM RDB$DATABASE
-- Но вот таким образом получить потом значение этой переменной нельзя,
-- т.к. пространство имен регистро-зависимое
SELECT RDB$GET_CONTEXT('USER_SESSION','My') FROM RDB$DATABASE
С помощью контекстных переменных можно сделать нумерацию строк в запросе
SELECT RDB$GET_CONTEXT('USER_TRANSACTION','ROW') AS ROWNUM,
E.*,
RDB$SET_CONTEXT('USER_TRANSACTION','ROW', CAST(COALESCE(RDB$GET_CONTEXT('USER_TRANSACTION','ROW'),0) AS INTEGER)+1) AS X
FROM EMPLOYEE E
Чтобы перезапуск вышеприведенного запроса (без commit’a или rollback’a) не приводил к увеличению счетчика строк, можно “проинициализировать” CONTEXT-переменную холостой выборкой из rdb$database с null-значениями всех полей. Эта “null-строка” далее отсеивается where-предикатом. Чтобы не отображался столбец ‘X’, нельзя удалять его из select-списка. Вместо этого надо включить его в выражение вычисления другого числового столбца, но так, чтобы это не повлияло на итоговый результат. Например, можно умножить ‘X’ на ноль и добавить к rownum - на результат это не повлияет:
select rownum+0*x rownum, emp_no, emp_name
from(
select
rdb$set_context('USER_TRANSACTION','row',0) rownum,
null emp_no,
null emp_name,
null x
from rdb$database
union all
select
1+cast(rdb$get_context('USER_TRANSACTION','row') as int) as rownum,
e.emp_no,
e.last_name emp_name,
rdb$set_context('USER_TRANSACTION','row', cast(coalesce(rdb$get_context('USER_TRANSACTION','row'),0) as integer)+1) as x
from
employee e
)t
where emp_no is not null
;
См. также
RDB$SET_CONTEXT
Источник
%Firebird%\doc\sql.extensions\README.context_variables2.txt
Обсуждение