# 创建转换

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

# 描述

创建转换定义一个新的变换。创建或替换转换将创建一个新的转换,或替换现有的定义。

转换指定如何使数据类型适应过程语言。例如,当在 PL/Python 中使用hstore类型,PL/Python 没有先验知识如何呈现hstorePython 环境中的值。语言实现通常默认使用文本表示,但是当关联数组或列表更合适时,这是不方便的。

一个变换指定了两个函数:

  • 将类型从 SQL 环境转换为语言的“from SQL”函数。该函数将在用该语言编写的函数的参数上调用。

  • 将类型从语言转换为 SQL 环境的“to SQL”函数。该函数将在用该语言编写的函数的返回值上调用。

    没有必要同时提供这两种功能。如果未指定,则在必要时将使用特定于语言的默认行为。(为了完全防止某个方向的转换发生,您还可以编写一个始终出错的转换函数。)

    为了能够创建转换,您必须拥有并拥有用法类型的特权,有用法语言的特权,拥有并拥有执行对 from-SQL 和 to-SQL 函数的特权(如果指定)。

# 参数

类型名称

转换的数据类型的名称。

语言名

转换的语言名称。

*from_sql_function_name*[(*参数类型* [, ...])]

用于将类型从 SQL 环境转换为语言的函数的名称。它必须采用一个类型的参数内部的和返回类型内部的.实际参数将是转换的类型,并且函数应该像这样编码。(但不允许声明返回的 SQL 级函数内部的没有至少一个类型的参数内部的.) 实际返回值将特定于语言实现。如果未指定参数列表,则函数名称在其模式中必须是唯一的。

*to_sql_function_name*[(*参数类型* [, ...])]

用于将类型从语言转换为 SQL 环境的函数的名称。它必须采用一个类型的参数内部的并返回作为转换类型的类型。实际的参数值将特定于语言实现。如果未指定参数列表,则函数名称在其模式中必须是唯一的。

# 笔记

采用丢弃变换删除变换。

# 例子

为类型创建转换hstore和语言plpythonu,首先设置类型和语言:

CREATE TYPE hstore ...;

CREATE EXTENSION 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)
);

实际上,这些命令将包含在扩展中。

贡献部分包含许多提供转换的扩展,可以作为真实世界的示例。

# 兼容性

这种形式的创建转换是一个 PostgreSQL 扩展。有一个创建转换SQL 标准中的命令,但它用于使数据类型适应客户端语言。PostgreSQL 不支持这种用法。

# 也可以看看

创建函数,创建语言,创建类型,丢弃变换