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
将创建一个新转换或替换现有定义。
转换指定如何将数据类型调整到过程语言。例如,当使用 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
的参数,则不允许声明一个返回 internal
的 SQL 级别的功能。)实际返回值将是语言实现的特定内容。如果没有指定参数列表,则该功能名称在其架构中必须是唯一的。
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 支持。