CREATE TRANSFORM

CREATE TRANSFORM — определить новую трансформацию


Синтаксис

CREATE [ OR REPLACE ] TRANSFORM FOR имя_типа LANGUAGE имя_языка (
    FROM SQL WITH FUNCTION имя_функции_из_sql [ (тип_аргумента [, ...]) ],
    TO SQL WITH FUNCTION имя_функции_в_sql [ (тип_аргумента [, ...]) ]
);

Описание

Команда CREATE TRANSFORM определяет новую трансформацию. CREATE OR REPLACE TRANSFORM либо создаст новую трансформацию, либо заменит существующее определение.

Трансформация указывает, как адаптировать тип данных к процедурному языку. Языковые реализации обычно по умолчанию используют текстовое представление, но это неудобно, когда, например, более подходящими были бы ассоциативный массив или список.

Трансформация задает две функции:

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

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

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

Чтобы иметь возможность создать трансформацию, нужно быть владельцем и иметь право USAGE для данного типа, иметь право USAGE для языка и быть владельцем и иметь право EXECUTE для функций из-SQL и в-SQL, если те заданы.


Параметры

имя_типа

Имя типа данных, для которого предназначена трансформация.

имя_языка

Имя языка, для которого предназначена трансформация.

имя_функции_из_sql[(тип_аргумента [, ...])]

Имя функции для преобразования типа из среды SQL в среду языка. Она должна принимать один аргумент типа internal и возвращать тип internal. Фактический аргумент будет иметь тип, предназначенный для трансформирования, и функция должна быть закодирована под это. (Но нельзя объявить функцию, возвращающую тип internal, на уровне SQL без как минимум одного входного аргумента типа internal.) Фактическое возвращаемое значение будет определяться реализацией языка. Если не указан список аргументов, имя функции должно быть уникальным в схеме.

имя_функции_в_sql[(тип_аргумента [, ...])]

Имя функции для преобразования типа из среды языка в среду SQL. Она должна принимать один аргумент типа internal и возвращать тип, для которого и предназначена трансформация. Фактическое значение аргумента будет определяться реализацией языка. Если не указан список аргументов, имя функции должно быть уникальным в схеме.


Примечания

Для удаления трансформации воспользуйтесь командой DROP TRANSFORM.


Примеры

Чтобы создать трансформацию для типа hstore и языка plpythonu, сначала нужно установить тип и язык:

CREATE TYPE hstore ...;

CREATE EXTENSION plpythonu;

Затем создать необходимые функции:

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 plpythonu (
    FROM SQL WITH FUNCTION hstore_to_plpython(internal),
    TO SQL WITH FUNCTION plpython_to_hstore(internal)
);

На практике эти команды будут обернуты в расширение.

Каталог share/extension содержит ряд расширений, предоставляющих трансформации, которые могут служить в качестве реальных примеров.


Совместимость

Эта форма CREATE TRANSFORM является расширением QHB. В стандарте SQL существует команда CREATE TRANSFORM, но она предназначена для адаптации типов данных к языкам на стороне клиента. Такой вариант использования QHB не поддерживается.


См. также

CREATE FUNCTION, CREATE LANGUAGE, CREATE TYPE, DROP TRANSFORM