CREATE TRANSFORM — 新しい変換を定義する
CREATE [ OR REPLACE ] TRANSFORM FORtype_name
LANGUAGElang_name
( FROM SQL WITH FUNCTIONfrom_sql_function_name
[ (argument_type
[, ...]) ], TO SQL WITH FUNCTIONto_sql_function_name
[ (argument_type
[, ...]) ] );
CREATE TRANSFORM
は新しい変換を定義します。
CREATE OR REPLACE TRANSFORM
は新しい変換を作成するか、あるいは既存の変換を置換します。
変換はデータ型を手続き言語にどのように適合させるかを定義します。
例えばhstore
型を使ってPL/Pythonの関数を書くとき、PL/Pythonはhstore
の値をPythonの環境でどのように表現するか、事前の知識がありません。
言語の実装は通常、デフォルトでテキスト表現を使いますが、これは例えば連想配列やリストの方がより適切な場合には不便です。
変換では次の2つの関数を指定します。
「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
型の引数を1つとり、internal
型の値を戻します。
実引数は変換される型になり、関数はそうであるとしてコーディングされます。
(しかし、少なくとも1つのinternal
型の引数がなければ、internal
を戻すSQLレベルの関数を宣言することができません。)
実際の戻り値は、言語の実装に依存したものになります。
引数リストが指定されない場合、関数名はスキーマ内で一意でなければなりません。
to_sql_function_name
[(argument_type
[, ...])]
型を言語からSQL環境に変換する関数の名前です。
internal
型の引数を1つとり、変換の型であるデータ型を戻します。
実引数の値は言語の実装に依存したものになります。
引数リストが指定されない場合、関数名はスキーマ内で一意でなければなりません。
変換を削除するにはDROP TRANSFORMを使います。
hstore
型で言語plpythonu
の変換を作成するため、まず以下のように型と言語を設定します。
CREATE TYPE hstore ...; CREATE LANGUAGE plpythonu ...;
Then create the necessary functions:
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) );
現実には、これらのコマンドは拡張の中にまとめられているでしょう。
contrib
の下には変換を提供するいくつかの拡張が含まれており、それらは現実世界での例となります。
この構文のCREATE TRANSFORM
はPostgreSQLの拡張です。
標準SQLにはCREATE TRANSFORM
コマンドがありますが、それはデータ型をクライアントの言語に適合させるためのものです。
その使用法はPostgreSQLではサポートされていません。