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
либо создаёт трансформацию, либо заменяет существующую.
Трансформация определяет, как преобразовать тип данных для процедурного языка. Например, если написать на языке PL/Python функцию, использующую тип hstore
, PL/Python заведомо не знает, как должны представляться значения hstore
в среде Python. Обычно реализации языка нисходят к текстовому представлению, но это может быть неудобно, когда более уместен был бы, например, ассоциативный массив или список.
Трансформация определяет две функции:
Функция «из SQL» преобразует тип из среды SQL в среду языка. Эта функция будет вызываться для аргументов функции, написанной на этом языке.
Функция «в SQL» преобразует тип из среды языка в среду SQL. Эта функция будет вызываться для значения, возвращаемого из функции на этом языке.
Предоставлять обе эти функции не требуется, можно ограничиться одной. Если одна из них не указана, при необходимости выбирается поведение, принятое для языка по умолчанию. (Чтобы полностью перекрыть путь трансформации в одну сторону, можно написать функцию, которая будет всегда выдавать ошибку.)
Чтобы создать трансформацию, необходимо быть владельцем и иметь право USAGE
для типа, иметь право USAGE
для языка, а также быть владельцем и иметь право EXECUTE
для функций из-SQL и в-SQL, если они задаются.
Параметры
имя_типа
Имя типа данных, для которого предназначена трансформация.
имя_языка
Имя языка, для которого предназначена трансформация.
имя_функции_из_sql
[(тип_аргумента
[, ...])]Имя функции для преобразования типа из среды SQL в среду языка. Она должна принимать один аргумент типа
internal
и возвращать типinternal
. Фактический аргумент будет иметь тип, заданный для трансформации, и сама функция должна рассчитывать на это. (Но на уровне SQL нельзя объявить функцию, возвращающую типinternal
, если она не принимает минимум один аргумент типа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) );
На практике эти команды помещаются в расширение.
В разделе contrib
представлено несколько расширений, в которых определены трансформации, что может послужить практическим примером реализации.
Совместимость
Первая форма CREATE TRANSFORM
является расширением PostgreSQL. В стандарте SQL есть команда CREATE TRANSFORM
, но её предназначение — преобразовывать типы для языков на стороне клиента. Этот вариант использования не поддерживается PostgreSQL.
См. также
CREATE FUNCTION, CREATE LANGUAGE, CREATE TYPE, DROP TRANSFORM