CREATE TRANSFORM#
CREATE TRANSFORM
CREATE TRANSFORM — определить новое преобразование
Синтаксис
CREATE [ OR REPLACE ] TRANSFORM FORtype_name
LANGUAGElang_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. Обычно языки реализации по умолчанию используют текстовое представление, но это неудобно, когда, например, более подходящими были бы ассоциативный массив или список.
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.
См. также
CREATE FUNCTION, CREATE LANGUAGE, CREATE TYPE, DROP TRANSFORM