2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 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 且至少帶有一個 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 TRANSFORMPostgreSQL 的一個擴充套件。在SQLSQL 標準中存在一個 CREATE TRANSFORM 命令,用於將資料型別適配到客戶端語言。 PostgreSQL 不支援這種用法。

提交更正

如果您在文件中看到任何不正確、與您對特定功能的使用經驗不符或需要進一步澄清的內容,請使用 此表單 來報告文件問題。