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特权。
变换的数据类型的名称。
变换的语言的名称。
用于将类型从SQL环境转换为语言的函数的名称。它必须接受一个类型为 internal的参数并且返回类型为internal。 实际的参数将是变换的类型,函数应该被编码,如果它是。 (但是不允许声明一个SQL级函数返回internal, 而没有至少一个类型为internal的参数。) 实际的返回值将是特定于语言实现的。
用于将类型从语言转换为SQL环境的函数的名称。它必须接受一个类型为 internal的参数,并返回作为转换类型的类型。 实际的参数值将是特定于语言实现的。
要为类型hstore和语言plpythonu 创建变换,首先设置类型和语言:
CREATE TYPE hstore ...; CREATE LANGUAGE 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部分包含多个提供转换的扩展,它们可以作为现实世界的例子。