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值。语言实现通常默认使用文本表示,但是例如,当关联数组或列表更合适时,这是不方便的。
转换指定了两个函数:
- “来自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但没有至少一个 internal类型参数的 SQL 层函数)。实际的返回值将与 语言的实现相关。如果没有指定参数列表,则函数名在该模式中必须唯一。
to_sql_function_name[(argument_type [, …])]
将该类型从语言转换到 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 部分包含许多提供变换的扩展,可以作为真实示例。