メニュー
Amazon Redshift
データベース開発者ガイド (API Version 2012-12-01)

CREATE FUNCTION

新しいスカラーのユーザー定義関数 (UDF) を作成します。

構文

Copy
CREATE [ OR REPLACE ] FUNCTION f_function_name ( [argument_name data_type [ , ... ] ] ) RETURNS data_type {VOLATILE | STABLE | IMMUTABLE } AS $$ python_program $$ LANGUAGE plpythonu;

Parameters

OR REPLACE

その関数がすでに存在するの関数と同じ名前と入力引数のデータタイプ、あるいは署名である場合、既存の関数を置き換えることを指定します。 同一のデータタイプセットを定義する新しい関数によってのみ既存の関数を置き換えることができます。 関数の置き換えは、スーパーユーザーのみが行うことができます。

すでに存在するの関数と同じ名前と入力引数のデータタイプで、異なる署名の関数を定義する場合は、新しい関数を作成することになります。 つまり、関数名はオーバーロードされます。 詳細については、「関数名の多重定義」を参照してください。

f_function_name

関数の名前。 スキーマ名を指定すると (myschema.myfunction など)、指定したスキーマを使用して関数が作成されます。 指定しない場合、現在のスキーマに関数が作成されます。 有効な名前の詳細については、「名前と識別子」を参照してください。

f_ をすべての UDF 名のプレフィックスとすることをお勧めします。 Amazon Redshift は UDF 名のプレフィックス f_ をリザーブしているので、f_ プレフィックスを使用すると、その UDF 名が既存また今後のすべての Amazon Redshift ビルトイン SQL の関数名とも競合しないことが保証されます。詳細については、「UDF の命名」を参照してください。

入力引数のデータタイプが異なる場合、同じ関数名で 1 つ以上の関数を定義することができます。 つまり、関数名はオーバーロードされます。 詳細については、「関数名の多重定義」を参照してください。

argument_name data_type

入力引数の名前とデータタイプの一覧。 UDF は、Amazon Redshift のすべての標準データタイプを実行できます。また UDF は、ANYELEMENT データタイプのサポートしており、このタイプは、実行時に示される対応する引数のデータタイプに基づく標準データタイプに自動的に変換されます。 複数の引数が ANYELEMENT を使用している場合には、一覧の最初の ANYELEMENT の引数に基づき、実行時に同じデータタイプに変換されます。 詳細については、「UDF のデータ型」および「データ型」を参照してください。

最大 32 の引数を指定できます。

RETURNS data_type

データタイプの値は関数によって返されます。 RETURNS データタイプは、どの標準 Amazon Redshift データタイプでも可能です。また、UDF は ANYELEMENT データタイプを使用できます。このタイプは、実行時に示される対応する引数のデータタイプに基づく標準データタイプに自動的に変換されます。 戻り型のデータタイプとして ANYELEMENT を指定する場合、少なくとも 1 つの ANYELEMENT 引数を使用する必要があります。 実際の戻り型のデータタイプは、関数が呼び出された場合に ANYELEMENT 引数から提供されるデータタイプと一致することになります。 詳細については、「UDF のデータ型」を参照してください。

VOLATILE | STABLE | IMMUTABLE

関数の変動率についてのクエリオプティマイザを報告します。

関数の最適な変動率の分類を厳正に設定することで、最高の最適化が得られます。 しかし、変動幅が厳正すぎると、オプティマイザはその呼び出しを誤って省略してしまい、よって不正確な結果セットを報告することになってしまいます。 厳正度の順に、低度の厳正度から変動率を分類すると:

  • 変動性

  • 安定

  • 不変

変動性

同じ引数が入っている場合、単一のステートメントに含まれる行であっても、関数は連続の呼び出しに異なる結果を返すことがあります。 クエリオプティマイザは変動的な関数のどのような動作についても仮定条件を作成しないので、変動性の関数を使用するクエリは、各入力行につき、関数の再評価が行われるべきです。

安定

同じ引数が入っている場合、関数が単一のステートメント内で処理されるすべての行に対して同じ結果を返すことが保証されます。 異なるステートメントから呼び出された場合、関数が異なる結果を返すことがあります。 この分類は、単一のステートメント内でのステートメントへの 1 回の呼び出しにおける関数の複数の呼び出しを最適化するオプティマイザを可能にします。

不変

同じ引数が入っている場合、関数は常に永遠に同じ結果を返します。 クエリが定数引数の IMMUTABLE 関数を呼び出すと、オプティマイザは関数を前評価します。

AS $$ ... $$ LANGUAGE plpythonu

実行されるステートメントとステートメントが書かれた言語を示すキーワードを含む構成。 リテラルキーワードが AS $$$$ LANGUAGE plpythonu であることが必須です。

Amazon Redshift では、dollar quoting という形式を使ったステートメントを関数に含める必要があります。 含まれるすべてがそのまま移行されます。 文字列の内容はそのまま書き込まれるため、どのような特殊文字も外す必要はありません。

dollar quoting では、2 つのドル記号 ($$) を使用して実行するステートメントの開始と終了を示します。使用例は次の通りです。

Copy
$$ my statement $$

任意で、それぞれのドル記号ペアの間に文字列を指定して、ステートメントの特定に役立たせることもできます。 使用できる文字列は、エンクロージャペアの開始と終了の両方において同じである必要があります。 この文字列では大文字と小文字が区別され、ドル記号が含まれたもの以外は、引用符で囲まれていない識別子と同じ規約条件に従います。 次の例では、test

Copy
$test$ my statement $test$
を使用します

dollar quoting に関する詳細については、PostgreSQL マニュアルの「Lexical Structure」セクションで、Dollar-quoted String Constants を参照してください。

関数と共に渡すステートメントは、Python ウェブサイトの Style Guide for Python Code に示されるインデント要件に準拠する必要があります。 Python (plpythonu) のみがサポートされる言語です。

python_program

値を返す有効で実行可能な Python プログラム。 詳細については、「UDF のための Python 言語のサポート」を参照してください。

次の例は、2 つの整数を比較し、大きいほうの数値を返す関数を作成する方法を示しています。

Copy
create function f_greater (a float, b float) returns float stable as $$ if a > b: return a return b $$ language plpythonu;

次の例は、SALES テーブルを検索して新しい f_greater 関数を呼び出すことによって、COMMISSION または PRICEPAID の 20% のどちらか大きいほうを返します。

Copy
select f_greater (commission, pricepaid*0.20) from sales;

このページの内容: