Перейти к основному содержимому

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

Доработка

Доработка не проводилась.

Ограничения

Ограничения отсутствуют.

Установка

Для установки расширения необходимо выполнить команду CREATE EXTENSION c правами superuser:

CREATE EXTENSION IF NOT EXISTS pg_variables WITH SCHEMA ext;

Настройка

Настройка не требуется.

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

  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);

    Пример ответа:

    pgv_get
    ---------
    7
    (1 row)
  3. Получение списка переменных с помощью функции 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)
  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));

    Пример ответа:

                           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)
  6. Удаление переменной с заданным именем из пакета:

    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)
  7. Получение списка созданных пакетов и объема памяти, используемый переменными, с помощью функции 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