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
将创建新的转换或替换现有定义。
转换指定如何将数据类型调整为过程语言。例如,在使用hstore
类型编写 PL/Python 函数时,PL/Python 之前不知道如何在 Python 环境中呈现hstore
值。语言实现通常默认使用文本表示形式,但这不方便,例如,当关联数组或列表更合适时。
转换指定两个函数
“from SQL” 函数,该函数将类型从 SQL 环境转换为语言。此函数将在用该语言编写的函数的参数上调用。
“to SQL” 函数,该函数将类型从语言转换为 SQL 环境。此函数将在用该语言编写的函数的返回值上调用。
不必同时提供这两个函数。如果未指定其中一个函数,则在必要时将使用特定于语言的默认行为。(若要完全阻止某个方向的转换,还可以编写一个始终出错的转换函数。)
要能够创建转换,您必须拥有并具有该类型的USAGE
权限,具有该语言的USAGE
权限,并且拥有并具有指定(如果指定)的 from-SQL 和 to-SQL 函数的EXECUTE
权限。
参数
type_name
转换的数据类型的名称。
lang_name
转换的语言名称。
from_sql_function_name
[(argument_type
[, ...])]用于将类型从 SQL 环境转换为语言的函数名称。它必须采用一个类型为
internal
的参数,并返回类型为internal
的值。实际参数将为转换的类型,并且该函数应按此方式进行编码。(但不允许声明一个返回internal
的 SQL 级函数,而没有至少一个类型为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
是PostgreSQL扩展。在SQL标准中有一个CREATE TRANSFORM
命令,但它用于将数据类型调整为客户端语言。这种用法不受PostgreSQL支持。