CREATE TRANSFORM
Эта страница переведена при помощи нейросети GigaChat.
CREATE TRANSFORM
- создание новой трансформации.
Синтаксис
CREATE [ OR REPLACE ] TRANSFORM FOR type_name LANGUAGE lang_name (
FROM SQL WITH FUNCTION from_sql_function_name [ (argument_type [, ...]) ],
TO SQL WITH FUNCTION to_sql_function_name [ (argument_type [, ...]) ]
);
Описание
CREATE TRANSFORM
создает новую трансформацию. Команда CREATE OR REPLACE TRANSFORM
либо создает новую трансформацию, либо заменяет существующее определение.
Трансформация указывает, как адаптировать тип данных для использования в процедурном языке. Например, при написании функции на PL/Python с использованием типа hstore
, PL/Python изначально не знает, как представить значения hstore
в среде Python. Реализации языков обычно по умолчанию используют текстовое представление, но это может быть неудобно, если, например, более подходящим вариантом было бы представление в виде ассоциативного массива или списка.
Трансформация определяет две функции:
- «из SQL» — преобразует значение типа из SQL-среды в язык программирования. Эта функция вызывается для аргументов функции, написанной на этом языке.
- «в SQL» — преобразует значение типа из языка программирования обратно в SQL-среду. Эта функция вызывается для возвращаемого значения функции, написанной на языке.
Указывать обе функции необязательно. Если какая-то из них не задана, будет использоваться поведение по умолчанию, определенное для языка. Если необходимо полностью запретить трансформацию в каком-то направлении, можно реализовать функцию, которая всегда вызывает ошибку.
Чтобы создать трансформацию, необходимо:
- быть владельцем типа и иметь на него привилегию
USAGE
; - иметь привилегию
USAGE
на язык; - быть владельцем и иметь привилегию
EXECUTE
на функции из-SQL и в-SQL, если они указаны.
Параметры
type_name
- Имя типа данных, для которого предназначена трансформация.
lang_name
- Имя языка, для которого предназначена трансформация.
from_sql_function_name[(argument_type [, ...])]
- Имя функции, преобразующей значение типа из SQL-среды в язык программирования. Эта функция должна принимать один аргумент типа
internal
и возвращатьinternal
. Фактический аргумент будет иметь тип, указанный в трансформации, и функция должна быть написана с учетом этого. Но нельзя объявить SQL-функцию, возвращающуюinternal
, без хотя бы одного аргумента типаinternal
. Возвращаемое значение будет специфичным для реализации языка. Если список аргументов не указан, имя функции должно быть уникальным в своей схеме.
to_sql_function_name[(argument_type [, ...])]
- Имя функции, преобразующей значение типа из языка программирования в SQL-среду. Эта функция должна принимать один аргумент типа
internal
и возвращать значение типа, указанного в трансформации. Фактическое значение аргумента будет специфичным для реализации языка. Если список аргументов не указан, имя функции должно быть уникальным в своей схеме.
Примечания
Используйте DROP TRANSFORM, чтобы удалить трансформацию.
Примеры
Чтобы создать трансформацию для типа hstore
и языка plpython3u
, сначала нужно создать тип и язык:
CREATE TYPE hstore ...;
CREATE EXTENSION plpython3u;
Затем создайте необходимые функции:
CREATE FUNCTION hstore_to_plpython(val internal) RETURNS internal
LANGUAGE C STRICT IMMUTABLE
AS ...;
CREATE FUNCTION plpython_to_hstore(val internal) RETURNS hstore
LANGUAGE C STRICT IMMUTABLE
AS ...;
И наконец, создайте трансформацию, соединяющую все вместе:
CREATE TRANSFORM FOR hstore LANGUAGE plpython3u (
FROM SQL WITH FUNCTION hstore_to_plpython(internal),
TO SQL WITH FUNCTION plpython_to_hstore(internal)
);
На практике эти команды будут упакованы в расширение.
В разделе contrib
представлено несколько расширений, в которых определены трансформации, что может послужить практическим примером реализации.
Совместимость
CREATE TRANSFORM
является расширением для PostgreSQL. В стандарте SQL есть команда CREATE TRANSFORM
, но она предназначена для адаптации типов данных к языкам на стороне клиента. Эта функциональность не поддерживается в PostgreSQL.
Смотрите также
CREATE FUNCTION, CREATE LANGUAGE, CREATE TYPE, DROP TRANSFORM