pg_variables. Функции для работы с переменными различных типов#
В исходном дистрибутиве установлено по умолчанию: нет.
Связанные компоненты: отсутствуют.
Схема размещения:
ext.
Расширение pg_variables содержит функции для работы с переменными различных типов. Созданные переменные существуют в течение текущей пользовательской сессии.
Примечание:
Это расширение нельзя использовать с автономными транзакциями и при включенном пуле соединений.
При создании переменные можно задать как нетранзакционные и транзакционные. По умолчанию переменные создаются нетранзакционными. Успешно созданная переменная продолжает существовать на протяжении всего сеанса, вне зависимости от возможных откатов транзакций. Переменные объединяются в пакеты (набор переменных). Это сделано для того, чтобы иметь переменные с разными именами или быстро удалить весь пакет переменных. Если пакет становится пустым, он автоматически удаляется.
При создании транзакционной переменной (с поддержкой транзакций и точек сохранения), а также при каждом последующем изменении ее значения, необходимо передавать дополнительный флаг is_transactional в последнем параметре функций pgv_set() (при создании) или pgv_insert() (при изменении). Другим функциям передавать этот флаг не нужно.
В случае если вызовы функций pgv_free() или pgv_remove() откатываются, затрагиваемые транзакционные переменные восстанавливаются, в отличие от нетранзакционных, которые удаляются необратимо.
Функции расширения#
Расширение pg_variables содержит функции, позволяющие создавать переменные скалярных типов, переменные-записи и переменные-массивы, читать их и управлять ими.
Cкалярные переменные#
Функция |
Описание |
|---|---|
|
Создание пакета с переменной скалярного типа |
|
Получение значений переменной скалярного типа. |
Массивы#
Функция |
Описание |
|---|---|
|
Создание пакета с переменными-массивами |
|
Получение значений массива. |
Записи#
Функция |
Описание |
|---|---|
|
Вставляет запись в набор переменных для заданного пакета. |
|
Изменяет запись с соответствующим первичным ключом (он задается в первом столбце |
|
Удаляет запись с соответствующим первичным ключом (он задается в первом столбце |
|
Возвращает записи из набора переменных. |
|
Возвращает записи из набора переменных с соответствующими первичными ключами (первичный ключ задается в первом столбце |
|
Возвращает записи из набора переменных с соответствующими первичными ключами (первичный ключ задается в первом столбце |
Функции разного назначения#
Функция |
Описание |
|---|---|
|
Возвращает |
|
Возвращает |
|
Удаляет переменную с заданным именем. Указанный пакет и переменная должны существовать, иначе будет выдана ошибка |
|
Удаляет заданный пакет и все его переменные. Указанный пакет должен существовать, иначе будет выдана ошибка |
|
Удаляет все пакеты и переменные |
|
Выводит список всех существующих переменных с именем соответствующего пакета и признаком того, что переменная транзакционная |
|
Возвращает список созданных пакетов и объем памяти, используемый переменными, в байтах. При использовании транзакционных переменных в этот список включаются все удаленные пакеты, которые могут быть восстановлены командой ROLLBACK |
Доработка#
Доработка не проводилась.
Ограничения#
Ограничения отсутствуют.
Установка#
Для установки расширения необходимо выполнить команду CREATE EXTENSION c правами superuser:
CREATE EXTENSION IF NOT EXISTS pg_variables WITH SCHEMA ext;
Настройка#
Настройка не требуется.
Использование модуля#
Определение переменных скалярного типа:
pgv_set(package text, name text, value anynonarray, is_transactional bool default false)Входные параметры:
package– имя пакета;name– имя переменной;value– значение переменной;is_transactional- признак транзакционной переменной (по умолчаниюfalse)
Возвращаемое значение:
void(пустое значение)
Команда определения нетранзакционной переменной:
SELECT pgv_set('package_name', 'var_text1', 'text variable'::text);Команда определения транзакционной переменной:
SELECT pgv_set('package_name', 'trans_var_int', 7, true);Получение значений переменных:
pgv_get(package text, name text, var_type anynonarray, strict bool default true)Входные параметры:
package– имя пакета;name– имя переменной;var_type– тип переменной;strict bool- логическое значение (по умолчаниюtrue)
Возвращаемое значение:
anynonarray/anynarray- значение переменной
Пример запроса:
SELECT pgv_get('package_name', 'var_int1', NULL::int);Пример ответа:
pgv_get --------- 7 (1 row)Получение списка переменных с помощью функции
pgv_list()Входные параметры:
нет.
Возвращаемое значение:
package- имя пакета;name- имя переменной;is_transactional (boolean)- признак транзакционной переменной (true/false).
Пример запроса:
SELECT * FROM pgv_list();Пример ответа:
package | name | is_transactional --------------+-----------+------------------ package_name1 | var_int3 | f package_name1 | var_int4 | t (2 rows)Определение переменных-записей из таблицы БД:
pgv_insert(package text, name text, r record, is_transactional bool default false)Входные параметры:
package– имя пакета;name– имя переменной;r record– данные из таблицы (первый столбец записи r — первичный ключ);is_transactional- признак транзакционной переменной (по умолчаниюfalse).
Возвращаемое значение:
void(пусто)
Определим переменные-записи на основе данных из таблицы
airportsв БД:SELECT pgv_insert('bookings','code',airports) FROM airports;Получение значений из списка записей переменных:
pgv_select(package text, name text, value anynonarray)Входные параметры:
package– имя пакета;name– имя переменной;value– значения переменных.
Возвращаемое значение:
record/set of records- значения переменных-записей.
В переменных-записях, полученных в примере 4, выполним поиск по ключу, напр. найдем аэропорт
Домодедовопо его кодуDME:SELECT pgv_select('bookings','code','DME'::char(3));Пример ответа:
pgv_select ----------------------------------------------------------- (DME,Домодедово,Москва,37.906111,55.408611,Europe/Moscow) (1 row)Кроме этого, можно сделать выборку не конкретной записи, а выбрать все записи переменной, указать
LIMIT,OFFSETкак и для обычной таблицы:SELECT pgv_select('bookings','code') LIMIT 10 OFFSET 50;Пример ответа:
pgv_select ----------------------------------------------------------- (VVO,Владивосток,Владивосток,132.148017,43.398953,Asia/Vladivostok) (PEZ,Пенза,Пенза,45.0211,53.1106,Europe/Moscow) (DME,Домодедово,Москва,37.906111,55.408611,Europe/Moscow) (SKX,Саранск,Саранск,45.2123,54.1251,Europe/Moscow) (PES,Бесовец,Петрозаводск,34.1547,61.8852,Europe/Moscow) (NBC,Бегишево,Нижнекамск,52.06,55.34,Europe/Moscow) (BTK,Братск,Братск,101.698331,56.370556,Asia/Irkutsk) (OVB,Толмачево,Новосибирск,82.650656,55.012622,Asia/Novosibirsk) (KVX,Победилово,Киров,49.3483,58.5033,Europe/Moscow) (IAR,Туношна,Ярославль,40.157369454444,57.560666676667,Europe/Moscow) (10 rows)Удаление переменной с заданным именем из пакета:
pgv_remove(package text, name text)Входные параметры:
package– имя пакета;name– имя переменной
Возвращаемое значение:
void(пусто)
Удалим переменную
var_int2из пакета с именемpackage_name:SELECT * FROM pgv_remove('package_name', 'var_int2');Пример ответа:
pgv_remove ------------ (1 row)Получение списка созданных пакетов и объема памяти, используемый переменными, с помощью функции
pgv_stats()Входные параметры:
нет
Возвращаемое значение:
TABLE(package text, allocated_memory bigint), где:package- имя пакета;allocated_memory (bigint)- объем памяти (в байтах)
Пример запроса:
SELECT * FROM pgv_stats();Пример ответа:
package | allocated_memory ---------------+------------------ package_name1 | 24576 package_name2 | 16384 package_name | 32768 (3 rows)
Ссылки на документацию разработчика#
Дополнительно поставляемый модуль pg_variables: https://github.com/postgrespro/pg_variables