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);
Пример ответа:Раскрыть type=sqlpgv_get --------- 7 (1 row)
-
-
Получение списка переменных с помощью функции
pgv_list()
.Входные параметры: нет.Возвращаемое значение:-
package
- имя пакета; -
name
- имя переменной; -
is_transactional (boolean)
- признак транзакционной переменной (true
/false
).
SELECT * FROM pgv_list();
Пример ответа:Раскрыть type=sqlpackage | 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));
Пример ответа:
Раскрыть type=sqlpgv_select ----------------------------------------------------------- (DME,Домодедово,Москва,37.906111,55.408611,Europe/Moscow) (1 row)
Кроме этого, можно сделать выборку не конкретной записи, а выбрать все записи переменной, указать
LIMIT
, OFFSET
как и для обычной таблицы:SELECT pgv_select('bookings','code') LIMIT 10 OFFSET 50;
Пример ответа:
Раскрыть type=sqlpgv_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');
Пример ответа:
Раскрыть type=sqlpgv_remove ------------ (1 row)
- Получение списка созданных пакетов и объема памяти, используемый переменными, с помощью функции
pgv_stats()
.
Входные параметры: нет.
Возвращаемое значение -
TABLE(package text, allocated_memory bigint)
, где:-
package
- имя пакета; -
allocated_memory (bigint)
- объем памяти (в байтах).
Пример запроса:
SELECT * FROM pgv_stats();
Пример ответа:
Раскрыть type=sqlpackage | allocated_memory ---------------+------------------ package_name1 | 24576 package_name2 | 16384 package_name | 32768 (3 rows)
Дополнительную информацию по поставляемому модулю pg_variables можно получить по ссылке.