2024年9月26日: PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不支持的版本:11 / 10 / 9.6 / 9.5

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 环境转换为语言。此函数将在用该语言编写的函数的参数上调用。

  • 一个“到 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 TRANSFORMPostgreSQL 扩展。SQL 标准中有一个 CREATE TRANSFORM 命令,但它是用于将数据类型适配到客户端语言。PostgreSQL 不支持此用法。SQL标准,但它是用于将数据类型适配到客户端语言。PostgreSQL 不支持此用法。

提交更正

如果您在文档中看到任何不正确的内容,与您对特定功能的体验不符,或者需要进一步说明,请使用 此表单 报告文档问题。