CREATE TRANSFORM#

CREATE TRANSFORM

CREATE TRANSFORM

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. Обычно языки реализации по умолчанию используют текстовое представление, но это неудобно, когда, например, более подходящими были бы ассоциативный массив или список.

A transform specifies two functions:

  • Функция из SQL, которая преобразует тип из среды SQL в язык. Эта функция будет вызываться для аргументов функции, написанной на языке.

  • Функция to SQL преобразует тип данных из языка в среду SQL. Эта функция будет вызвана для возвращаемого значения функции, написанной на данном языке.

Необходимо предоставить оба этих функции. Если одна из них не указана, будет использоваться языкоспецифическое поведение по умолчанию, если это необходимо. (Чтобы вообще предотвратить преобразование в определенном направлении, вы также можете написать функцию преобразования, которая всегда вызывает ошибку).

Чтобы иметь возможность создать преобразование, вы должны владеть и иметь привилегию USAGE на типе, иметь привилегию USAGE на языке, а также владеть и иметь привилегию EXECUTE на функциях from-SQL и to-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 является расширением Tantor BE. В стандарте SQL есть команда CREATE TRANSFORM, но она предназначена для адаптации типов данных к языкам клиентов. Это использование не поддерживается Tantor BE.