pg_variables

Функции для работы с переменными различных типов.
Схема размещения: ext.
Расширение pg_variables содержит функции для работы с переменными различных типов. Созданные переменные существуют в течение текущей пользовательской сессии.
Это расширение нельзя использовать с автономными транзакциями и при включенном пуле соединений.
При создании переменные можно задать как нетранзакционные и транзакционные. По умолчанию переменные создаются нетранзакционными. Успешно созданная переменная продолжает существовать на протяжении всего сеанса, вне зависимости от возможных откатов транзакций. Переменные объединяются в пакеты (набор переменных). Это сделано для того, чтобы иметь переменные с разными именами или быстро удалить весь пакет переменных. Если пакет становится пустым, он автоматически удаляется.
При создании транзакционной переменной (с поддержкой транзакций и точек сохранения), а также при каждом последующем изменении ее значения, необходимо передавать дополнительный флаг is_transactional в последнем параметре функций pgv_set() (при создании) или pgv_insert() (при изменении). Другим функциям передавать этот флаг не нужно.
В случае если вызовы функций pgv_free() или pgv_remove() откатываются, затрагиваемые транзакционные переменные восстанавливаются, в отличие от нетранзакционных, которые удаляются необратимо.
Функции расширения:
Расширение pg_variables содержит функции, позволяющие создавать переменные скалярных типов, переменные-записи и переменные-массивы, читать их и управлять ими.
Cкалярные переменные:
ФункцияОписание
pgv_set(package text, name text, value anynonarray, is_transactional bool default false)
Создание пакета с переменной скалярного типа
pgv_get(package text, name text, var_type anynonarray, strict bool default true)
Получение значений переменной скалярного типа.
Функция проверяет создан пакет и переменная (если указанный пакет или переменная не существуют, будет выдана ошибка), а также тип переменной (при несоответствии заданного типа типу переменной будет выдана ошибка)
Массивы:
ФункцияОписание
pgv_set(package text, name text, value anyarray, is_transactional bool default false)
Создание пакета с переменными-массивами
pgv_get(package text, name text, var_type anyarray, strict bool default true)
Получение значений массива.
Функция проверяет создан пакет и переменная (если указанный пакет или переменная не существуют, будет выдана ошибка), а также тип переменной (при несоответствии заданного типа типу переменной будет выдана ошибка)
Записи:
ФункцияОписание
pgv_insert(package text, name text, r record, is_transactional bool default false)
Вставляет запись в набор переменных для заданного пакета.
Если пакет или переменная не существуют, они создаются автоматически. Первый столбец записи r — первичный ключ. Если запись с таким же первичным ключом уже существует или этот набор переменных имеет другую структуру, выдается ошибка
pgv_update(package text, name text, r record)
Изменяет запись с соответствующим первичным ключом (он задается в первом столбце r).
Возвращает true, если запись была найдена. Если этот набор переменных имеет другую структуру, выдается ошибка.
При использовании данной функции необходимо сначала создать пакет и переменную с помощью функции pgv_insert(). Тип переменной и тип записи должны быть одинаковыми, иначе будет выдана ошибка
pgv_delete(package text, name text, value anynonarray)
Удаляет запись с соответствующим первичным ключом (он задается в первом столбце r). Возвращает true, если запись была найдена.
При использовании данной функции необходимо сначала создать пакет и переменную с помощью функции pgv_insert(). Тип переменной и тип записи должны быть одинаковыми, иначе будет выдана ошибка
pgv_select(package text, name text)
Возвращает записи из набора переменных.
При использовании данной функции необходимо сначала создать пакет и переменную с помощью функции pgv_insert(). Тип переменной и тип записи должны быть одинаковыми, иначе будет выдана ошибка
pgv_select(package text, name text, value anynonarray)
Возвращает записи из набора переменных с соответствующими первичными ключами (первичный ключ задается в первом столбце r).
При использовании данной функции необходимо сначала создать пакет и переменную с помощью функции pgv_insert(). Тип переменной и тип записи должны быть одинаковыми, иначе будет выдана ошибка
pgv_select(package text, name text, value anyarray)
Возвращает записи из набора переменных с соответствующими первичными ключами (первичный ключ задается в первом столбце r).
При использовании данной функции необходимо сначала создать пакет и переменную с помощью функции pgv_insert(). Тип переменной и тип записи должны быть одинаковыми, иначе будет выдана ошибка
Функции разного назначения:
ФункцияОписание
pgv_exists(package text, name text)
Возвращает true, если существует пакет и переменная
pgv_exists(package text)
Возвращает true, если существует указанный пакет
pgv_remove(package text, name text)
Удаляет переменную с заданным именем. Указанный пакет и переменная должны существовать, иначе будет выдана ошибка
pgv_remove(package text)
Удаляет заданный пакет и все его переменные. Указанный пакет должен существовать, иначе будет выдана ошибка
pgv_free()
Удаляет все пакеты и переменные
pgv_list()
Выводит список всех существующих переменных с именем соответствующего пакета и признаком того, что переменная транзакционная
pgv_stats()
Возвращает список созданных пакетов и объем памяти, используемый переменными, в байтах. При использовании транзакционных переменных в этот список включаются все удаленные пакеты, которые могут быть восстановлены командой ROLLBACK

Использование модуля

  1. Определение переменных скалярного типа:
    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);
  2. Получение значений переменных:
    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);
    Пример ответа:
    Раскрыть type=sql
    pgv_get
    ---------
    7
    (1 row)
    
  3. Получение списка переменных с помощью функции pgv_list().
    Входные параметры: нет.
    Возвращаемое значение:
    • package - имя пакета;
    • name - имя переменной;
    • is_transactional (boolean) - признак транзакционной переменной (true/false).
    SELECT * FROM pgv_list();
    Пример ответа:
    Раскрыть type=sql
        package   |   name    | is_transactional
    --------------+-----------+------------------
    package_name1 | var_int3  | f
    package_name1 | var_int4  | t
    (2 rows)
    
  4. Определение переменных-записей из таблицы БД:
    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;
  5. Получение значений из списка записей переменных:
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));
Пример ответа:
Раскрыть type=sql
                       pgv_select
-----------------------------------------------------------
(DME,Домодедово,Москва,37.906111,55.408611,Europe/Moscow)
(1 row)
Кроме этого, можно сделать выборку не конкретной записи, а выбрать все записи переменной, указать LIMIT, OFFSET как и для обычной таблицы:
SELECT pgv_select('bookings','code') LIMIT 10 OFFSET 50;
Пример ответа:
Раскрыть type=sql
                       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)
  1. Удаление переменной с заданным именем из пакета:
pgv_remove(package text, name text)
Входные параметры:
  • package – имя пакета;
  • name – имя переменной.
Возвращаемое значение: void (пусто).
Удалим переменную var_int2 из пакета с именем package_name:
SELECT * FROM pgv_remove('package_name', 'var_int2');
Пример ответа:
Раскрыть type=sql
pgv_remove
------------

(1 row)
  1. Получение списка созданных пакетов и объема памяти, используемый переменными, с помощью функции pgv_stats().
Входные параметры: нет.
Возвращаемое значение - TABLE(package text, allocated_memory bigint), где:
  • package - имя пакета;
  • allocated_memory (bigint) - объем памяти (в байтах).
Пример запроса:
SELECT * FROM pgv_stats();
Пример ответа:
Раскрыть type=sql
    package    | allocated_memory
---------------+------------------
 package_name1 |            24576
 package_name2 |            16384
 package_name  |            32768
(3 rows)

Ссылки на документацию разработчика

Дополнительную информацию по поставляемому модулю pg_variables можно получить по ссылке.
Предыдущий раздел
pg_trgm
Следующий раздел
pg_visibility
Была ли страница полезной?