CREATE TRANSFORM <refpurpose>define a new transform</refpurpose> — 新しい変換を定義する
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
[, ...]) ] );
<command>CREATE TRANSFORM</command> defines a new transform.
<command>CREATE OR REPLACE TRANSFORM</command> will either create a new
transform, or replace an existing definition.
CREATE TRANSFORM
は新しい変換を定義します。
CREATE OR REPLACE TRANSFORM
は新しい変換を作成するか、あるいは既存の変換を置換します。
A transform specifies how to adapt a data type to a procedural language.
For example, when writing a function in PL/Python using
the <type>hstore</type> type, PL/Python has no prior knowledge how to
present <type>hstore</type> values in the Python environment. Language
implementations usually default to using the text representation, but that
is inconvenient when, for example, an associative array or a list would be
more appropriate.
変換はデータ型を手続き言語にどのように適合させるかを定義します。
例えばhstore
型を使ってPL/Pythonの関数を書くとき、PL/Pythonはhstore
の値をPythonの環境でどのように表現するか、事前の知識がありません。
言語の実装は通常、デフォルトでテキスト表現を使いますが、これは例えば連想配列やリストの方がより適切な場合には不便です。
A transform specifies two functions: 変換では次の2つの関数を指定します。
A <quote>from SQL</quote> function that converts the type from the SQL environment to the language. This function will be invoked on the arguments of a function written in the language. 「from SQL」関数では、型をSQL環境から言語へと変換します。 この関数は、その言語で記述された関数の引数で呼び出されます。
A <quote>to SQL</quote> function that converts the type from the language to the SQL environment. This function will be invoked on the return value of a function written in the language. 「to SQL」関数では、型を言語からSQL環境へと変換します。 この関数は、その言語で記述された関数の戻り値で呼び出されます。
It is not necessary to provide both of these functions. If one is not specified, the language-specific default behavior will be used if necessary. (To prevent a transformation in a certain direction from happening at all, you could also write a transform function that always errors out.) これらの関数を両方とも提供する必要はありません。 一方が指定されなければ、必要な時はその言語独自のデフォルトの動作が使われます。 (ある方向への変換がまったく起きないようにするためには、必ずエラーを発生させる変換関数を作成することもできます。)
To be able to create a transform, you must own and
have <literal>USAGE</literal> privilege on the type, have
<literal>USAGE</literal> privilege on the language, and own and
have <literal>EXECUTE</literal> privilege on the from-SQL and to-SQL
functions, if specified.
変換を作成するには、その型を所有し、そのUSAGE
権限があること、言語のUSAGE
権限があること、from-SQL関数あるいはto-SQL関数を指定する場合は、それらを所有し、そのEXECUTE
権限があることが必要です。
type_name
The name of the data type of the transform. 変換の対象となるデータ型の名前です。
lang_name
The name of the language of the transform. 変換の対象となる言語の名前です。
from_sql_function_name
[(argument_type
[, ...])]
The name of the function for converting the type from the SQL
environment to the language. It must take one argument of
type <type>internal</type> and return type <type>internal</type>. The
actual argument will be of the type for the transform, and the function
should be coded as if it were. (But it is not allowed to declare an
SQL-level function returning <type>internal</type> without at
least one argument of type <type>internal</type>.) The actual return
value will be something specific to the language implementation.
If no argument list is specified, the function name must be unique in
its schema.
型をSQL環境から言語に変換する関数の名前です。
internal
型の引数を1つとり、internal
型の値を戻します。
実引数は変換される型になり、関数はそうであるとしてコーディングされます。
(しかし、少なくとも1つのinternal
型の引数がなければ、internal
を戻すSQLレベルの関数を宣言することができません。)
実際の戻り値は、言語の実装に依存したものになります。
引数リストが指定されない場合、関数名はスキーマ内で一意でなければなりません。
to_sql_function_name
[(argument_type
[, ...])]
The name of the function for converting the type from the language to
the SQL environment. It must take one argument of type
<type>internal</type> and return the type that is the type for the
transform. The actual argument value will be something specific to the
language implementation.
If no argument list is specified, the function name must be unique in
its schema.
型を言語からSQL環境に変換する関数の名前です。
internal
型の引数を1つとり、変換の型であるデータ型を戻します。
実引数の値は言語の実装に依存したものになります。
引数リストが指定されない場合、関数名はスキーマ内で一意でなければなりません。
Use <link linkend="sql-droptransform"><command>DROP TRANSFORM</command></link> to remove transforms.
変換を削除するにはDROP TRANSFORM
を使います。
To create a transform for type <type>hstore</type> and language
<literal>plpython3u</literal>, first set up the type and the language:
hstore
型で言語plpython3u
の変換を作成するため、まず以下のように型と言語を設定します。
CREATE TYPE hstore ...; CREATE EXTENSION plpython3u;
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 ...;
And finally create the transform to connect them all together: そして最後に、それらを互いに接続する変換を以下のように作成します。
CREATE TRANSFORM FOR hstore LANGUAGE plpython3u ( FROM SQL WITH FUNCTION hstore_to_plpython(internal), TO SQL WITH FUNCTION plpython_to_hstore(internal) );
In practice, these commands would be wrapped up in an extension. 現実には、これらのコマンドは拡張の中にまとめられているでしょう。
The <filename>contrib</filename> section contains a number of extensions
that provide transforms, which can serve as real-world examples.
contrib
の下には変換を提供するいくつかの拡張が含まれており、それらは現実世界での例となります。
This form of <command>CREATE TRANSFORM</command> is a
<productname>PostgreSQL</productname> extension. There is a <command>CREATE
TRANSFORM</command> command in the <acronym>SQL</acronym> standard, but it
is for adapting data types to client languages. That usage is not supported
by <productname>PostgreSQL</productname>.
この構文のCREATE TRANSFORM
はPostgreSQLの拡張です。
標準SQLにはCREATE TRANSFORM
コマンドがありますが、それはデータ型をクライアントの言語に適合させるためのものです。
その使用法はPostgreSQLではサポートされていません。