CREATE TRANSFORM

CREATE TRANSFORM — 定義一個新的轉變

語法

  1. CREATE [ OR REPLACE ] TRANSFORM FOR type_name LANGUAGE lang_name (
  2. FROM SQL WITH FUNCTION from_sql_function_name [ (argument_type [, ...]) ],
  3. TO SQL WITH FUNCTION to_sql_function_name [ (argument_type [, ...]) ]
  4. );

說明

CREATE TRANSFORM 定義一個新的轉換。CREATE OR REPLACE TRANSFORM 將建立新的轉換,或替換現有定義。

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 的參數,則不允許聲明回傳 internal 的 SQL 級函數。)實際回傳值將是特定於語言實作的內容。如果未指定參數列表,則函數名稱在其綱要中必須是唯一的。

to_sql_function_name[(argument_type [, …])]

用於將資料型別從程序語言轉換為 SQL 環境的函數名稱。它必須採用型別為 internal 的一個參數,並回傳作為轉換型別的型別。實際參數值將是特定於語言實作的內容。如果未指定參數列表,則函數名稱在其綱要中必須是唯一的。

注意

使用 DROP TRANSFORM 移除轉換。

範例

要為型別 hstore 和語言 plpythonu 建立轉換,首先要建立型別和語言:

  1. CREATE TYPE hstore ...;
  2. CREATE LANGUAGE plpythonu ...;

然後建立必要的函數:

  1. CREATE FUNCTION hstore_to_plpython(val internal) RETURNS internal
  2. LANGUAGE C STRICT IMMUTABLE
  3. AS ...;
  4. CREATE FUNCTION plpython_to_hstore(val internal) RETURNS hstore
  5. LANGUAGE C STRICT IMMUTABLE
  6. AS ...;

最後建立轉換將它們連結在一起:

  1. CREATE TRANSFORM FOR hstore LANGUAGE plpythonu (
  2. FROM SQL WITH FUNCTION hstore_to_plpython(internal),
  3. TO SQL WITH FUNCTION plpython_to_hstore(internal)
  4. );

實際上,這些指令將被包含在延伸套件中。

contrib 包含許多提供轉換的延伸套件,可以作為真實範例。

相容性

這種形式的 CREATE TRANSFORM 是 PostgreSQL 延伸功能。SQL 標準中有一個 CREATE TRANSFORM 指令,但它用於使資料型別適應用戶端語言。 PostgreSQL 不支援這種用法。

參閱

CREATE FUNCTION, CREATE LANGUAGE, CREATE TYPE, DROP TRANSFORM