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

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