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
值。语言实现通常默认使用文本表示,但是当例如关联数组或列表更合适时,这会很不方便。
转换指定两个函数
一个 “从 SQL” 函数,用于将类型从 SQL 环境转换为语言环境。此函数将在以该语言编写的函数的参数上调用。
一个 “到 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 不支持这种用法。
如果您在文档中发现任何不正确、与您使用特定功能的体验不符或需要进一步澄清的内容,请使用此表单报告文档问题。