Postgresql 中文操作指南

CREATE TRANSFORM

CREATE TRANSFORM — 定义新的转换

Synopsis

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 [, ...]) ]
);

Description

CREATE TRANSFORM 定义新的转换。 CREATE OR REPLACE TRANSFORM 将创建新转换或替换现有定义。

变换指定如何将数据类型适配到一个过程语言中。例如,在使用 hstore 类型编写 PL/Python 语言的函数时,PL/Python 本身不具备如何展示 hstore 值的知识。语言实现一般都默认使用文本表示,但在联想数组或列表更合适的情况下,这种方式很繁琐。

一个变换指定两个函数:

两个函数都不一定要提供。如果未指定,必要时将使用针对语言的默认行为。(要阻止从某个方向进行变换,还可以编写一个始终出错的变换函数。)

要能够创建一个变换,你必须拥有该类型并具有 USAGE 权限,对该语言具有 USAGE 权限,并且如果指定了,拥有 from-SQL 和 to-SQL 函数并具有 EXECUTE 权限。

Parameters

  • type_name

    • 转换的数据类型的名称。

  • lang_name

    • 转换的语言名称。

  • _from_sql_function_name[(argument_type [, …​])]_

    • 将类型从 SQL 环境转换为该语言的函数名称。它必须接收一个 internal 类型的参数并返回一个 internal 类型的值。真实的参数将是用于该变换的类型,函数应该按照其编码进行。(但如果至少有一个 internal 类型的参数,则不允许声明一个返回 internal 类型的 SQL 级函数。)真实返回值将是特定于语言实现的内容。如果未指定参数列表,则该函数名称在其中架构中必须唯一。

  • _to_sql_function_name[(argument_type [, …​])]_

    • 将类型从该语言转换为 SQL 环境的函数名称。它必须接收一个 internal 类型的参数并返回一个与该变换的类型相同的类型。真实参数值将是特定于语言实现的内容。如果未指定参数列表,则该函数名称在其中架构中必须唯一。

Notes

DROP TRANSFORM 删除变换。

Examples

要为 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 部分包含许多提供变换的扩展,这些扩展可以作为实际示例。

Compatibility

这种形式的 CREATE TRANSFORM 是 PostgreSQL 扩展。SQL 标准中有一个 CREATE TRANSFORM 命令,但它用于将数据类型适配到客户端语言。PostgreSQL 不支持这样的用法。