PostgreSQL CREATE TRANSFORM

2021-09-10 13:48 更新

CREATE TRANSFORM — 定義一個(gè)新的轉(zhuǎn)換

大綱

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定義一種新的轉(zhuǎn)換。 CREATE OR REPLACE TRANSFORM將 創(chuàng)建一種新的轉(zhuǎn)換或者替換現(xiàn)有的定義。

一種轉(zhuǎn)換指定了如何把一種數(shù)據(jù)類型適配到一種過程語言。例如,在用 PL/Python 編寫一個(gè)使用hstore類型的函數(shù)時(shí),PL/Python 沒有關(guān)于如何在 Python 環(huán)境中表示hstore值的先驗(yàn)知識。 語言的實(shí)現(xiàn)通常默認(rèn)會使用文本表示,但是在一些時(shí)候這很不方便,例如 有時(shí)可能用一個(gè)聯(lián)合數(shù)組或者列表更合適。

一種轉(zhuǎn)換指定了兩個(gè)函數(shù):

  • 一個(gè)from SQL函數(shù)負(fù)責(zé)將類型從 SQL 環(huán)境轉(zhuǎn)換到語言。 這個(gè)函數(shù)將在該語言編寫的一個(gè)函數(shù)的參數(shù)上調(diào)用。

  • 一個(gè)to SQL函數(shù)負(fù)責(zé)將類型從語言轉(zhuǎn)換到 SQL 環(huán)境。這 個(gè)函數(shù)將在該語言編寫的一個(gè)函數(shù)的返回值上調(diào)用。

沒有必要同時(shí)提供這些函數(shù)。如果有一種沒有被指定,將在必要時(shí)使用與語言相 關(guān)的默認(rèn)行為(為了完全阻止在一個(gè)方向上發(fā)生轉(zhuǎn)換,你也可以寫一個(gè)總是報(bào)錯(cuò) 的轉(zhuǎn)換函數(shù))。

要?jiǎng)?chuàng)建一種轉(zhuǎn)換,你必須擁有該類型并且具有該類型上的 USAGE特權(quán),擁有該語言上的 USAGE特權(quán),并且擁有 from-SQL 和 to-SQL 函數(shù)(如果 指定了)及其上的EXECUTE特權(quán)。

參數(shù)

type_name

該轉(zhuǎn)換的數(shù)據(jù)類型的名稱。

lang_name

該轉(zhuǎn)換的語言的名稱。

from_sql_function_name[(argument_type [, ...])]

將該類型從 SQL 環(huán)境轉(zhuǎn)換到該語言的函數(shù)名。它必須接受一個(gè) internal類型的參數(shù)并且返回類型internal。 實(shí)參將是該轉(zhuǎn)換所適用的類型,并且該函數(shù)也應(yīng)該被寫成認(rèn)為它是那種類型( 但是不允許聲明一個(gè)返回internal但沒有至少一個(gè) internal類型參數(shù)的 SQL 層函數(shù))。實(shí)際的返回值將與 語言的實(shí)現(xiàn)相關(guān)。如果沒有指定參數(shù)列表,則函數(shù)名在該模式中必須唯一。

to_sql_function_name[(argument_type [, ...])]

將該類型從語言轉(zhuǎn)換到 SQL 環(huán)境的函數(shù)名。它必須接受一個(gè) internal類型的參數(shù)并且返回該轉(zhuǎn)換所適用的類型。實(shí)參值 將與語言的實(shí)現(xiàn)相關(guān)。如果沒有指定參數(shù)列表,則函數(shù)名在該模式中必須唯一。

注解

使用DROP TRANSFORM移除轉(zhuǎn)換。

示例

要為類型hstore和語言 plpythonu創(chuàng)建一種轉(zhuǎn)換,先搞定該類型和語言:

CREATE TYPE hstore ...;

CREATE EXTENSION plpythonu;

然后創(chuàng)建需要的函數(shù):

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 ...;

最后創(chuàng)建轉(zhuǎn)換把它們連接起來:

CREATE TRANSFORM FOR hstore LANGUAGE plpythonu (
    FROM SQL WITH FUNCTION hstore_to_plpython(internal),
    TO SQL WITH FUNCTION plpython_to_hstore(internal)
);

實(shí)際上,這些命令將被包裹在擴(kuò)展中。

contrib小節(jié)包含了一些提供轉(zhuǎn)換的擴(kuò)展, 它們可以作為實(shí)際的例子。

兼容性

這種形式的CREATE TRANSFORM是一種 PostgreSQL擴(kuò)展。在 SQL標(biāo)準(zhǔn)中有一個(gè)CREATE TRANSFORM命令,但是它是用于把數(shù)據(jù)類型適配到 客戶端語言。該用法不受 PostgreSQL支持。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號