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 |
-
Определение переменных скалярного типа:
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 можно получить по ссылке.