CREATE TRANSFORM — создание нового преобразования
CREATE [ OR REPLACE ] TRANSFORM FORtype_nameLANGUAGElang_name( FROM SQL WITH FUNCTIONfrom_sql_function_name[ (argument_type[, ...]) ], TO SQL WITH FUNCTIONto_sql_function_name[ (argument_type[, ...]) ] );
CREATE TRANSFORM определяет новое преобразование.
CREATE OR REPLACE TRANSFORM либо создаст новое преобразование,
либо заменит существующее определение.
Преобразование определяет, как адаптировать тип данных для процедурного языка.
Например, при написании функции на PL/Python с использованием
типа hstore, PL/Python заранее не знает, как
представить значения hstore в окружении Python. Реализации языков
обычно по умолчанию используют текстовое представление, но это
неудобно, когда, например, ассоциативный массив или список был бы
более подходящим.
Преобразование задаёт две функции:
Функция «from 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 является
расширением Digital Q.DataBase. В стандарте SQL существует команда
CREATE TRANSFORM, но она предназначена для адаптации типов данных к
клиентским языкам. Такое использование не поддерживается
Digital Q.DataBase.
CREATE FUNCTION, CREATE LANGUAGE, CREATE TYPE, DROP TRANSFORM