支援的版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11 / 10 / 9.6 / 9.5

CREATE TRANSFORM

CREATE TRANSFORM — 定義新的轉換 (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 值。 語言實作通常預設為使用文字表示法,但例如,當關聯陣列或列表更合適時,這很不方便。

轉換指定兩個函數:

  • from SQL 函數,用於將類型從 SQL 環境轉換為語言。 此函數將在以該語言編寫的函數的引數上呼叫。

  • to 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 不支援該用法。

提交更正

如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的地方,請使用此表單報告文件問題。