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