他のバージョンの文書 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

CREATE FUNCTION

Name

CREATE FUNCTION -- 新しい関数を定義

Synopsis

CREATE [ OR REPLACE ] FUNCTION name ( [ argtype [, ...] ] )
    RETURNS rettype
    AS 'definition'
    LANGUAGE langname
    [ WITH ( attribute [, ...] ) ]
CREATE [ OR REPLACE ] FUNCTION name ( [ argtype [, ...] ] )
    RETURNS rettype
    AS 'obj_file', 'link_symbol'
    LANGUAGE langname
    [ WITH ( attribute [, ...] ) ]

説明

CREATE FUNCTION は新しい関数を定義します。 CREATE OR REPLACE FUNCTION は、新しい関数の作成、または、既存定義の置換のどちらかを行ないます。

パラメータ

name

作成する関数の名前です。この名前は一意である必要はありません。これは関数はオーバーロード可能であるからですが、同じ名前の関数は異なった引数型を持たなければなりません。

argtype

もしあれば、関数の引数のデータ型です。入力型は、基本型、複合型、opaque、既存の列の型と同じ型を使用することができます。 opaque は、char * などの非 SQL 型の引数を受け付けることを示します。列の型は tablename. columnname %TYPE を使用することで示されます。この形の使用は、テーブル定義の変更から関数の作成を独立させることを補助することができる場合があります。

rettype

返されるデータ型です。出力の型は基本型、複合型、setof 型、 opaque、または、既存の列の型と同じものを指定することができます。 setof 修飾子はその関数が、1つのアイテムではなくアイテムの集合を返すことを示します。戻り値の型がopaqueと宣言された関数は値を返しません。これらは直接呼び出されることはできません。トリガ関数はこの機能を使用して作成されます。

definition

関数を定義する文字列です。この意味は言語に依存します。内部的な関数名、オブジェクトファイルへのパス、SQL問い合わせ、手続き言語で書かれたテキストなどを指定できます。

obj_file, link_symbol

この形式のAS句は、C言語のソースコード中の関数名がSQL関数の名前と同じでない場合、動的にリンクされたC言語関数に使われます。文字列obj_file は動的にロードできるオブジェクトを含むファイルの名前で、 link_symbol はC言語ソースコード中の関数の名前であるオブジェクトのリンクシンボルです。

langname

plnameが作成された手続き言語の名前であるときは、sqlCinternalplnameを指定できます。詳細は CREATE LANGUAGE を参照してください。後方互換のため、この名前を単一引用符で括ることもできます。

attribute

最適化に使われる関数のオプション情報です。詳細は下記を参照してください。

関数を作成したユーザがその関数の所有者になります。

以下の属性はWITH句の中で使われることがあります。

iscachable

Iscachableはその関数が同じ引数値を与えられると常に同じ結果を返す(つまり、データベース検索をしたり、その引数リスト中に存在する情報を直接使用したりしない)ことを示します。オプティマイザは関数の呼び出しを事前に評価することが安全かどうかを調べるためにiscachableを使います。

isstrict

isstrictは、関数に NULL が引数として与えられるとその関数は常に NULL を返すことを示します。もしこの属性が指定されると、その関数に NULL 引数がある場合実行されません。代わりに NULL という結果が自動的に仮定されます。isstrictが指定されないと、その関数は NULL 入力でも呼び出されます。その場合は必要に応じて NULL を確認し、適切な対応をすることが関数の作成者の責任になります。

注釈

さらに詳しい外部関数の書き方については PostgreSQL プログラマガイドの、関数を使った PostgreSQL の拡張に関する章を参照してください。

すべてのSQLの型の構文は入力引数と返り値に認められています。しかし、型指定のいくつかの細部(たとえばnumeric型の精度フィールド)は、その関数の実装の仕方に責任があり、CREATE FUNCTION コマンドによって警告なく包含されます(つまり認識や強制はされません)。

PostgreSQLは関数のオーバーロード を許可します。これは、異なる引数の型を持っていれば別の関数が同じ名前を使うことができるということです。しかしこの機能は内部とC言語関数では注意して使わなくてはなりません。

2つの内部関数が同じCの名前を持っていると、リンク時にエラーが発生します。これを回避するためには、2つの関数に異なるCの名前を与え(たとえば、C の名前の一部として引数の型などを使います)、そしてそれらの名前を CREATE FUNCTIONのAS句の中で指定します。もしそのAS句が空のままの場合は、CREATE FUNCTIONはその関数のCの名前はSQLの名前と同じであると仮定します。

同様に、SQL関数名を複数のC言語関数でオーバーロードするときは、それぞれのC言語関数のインスタンスに異なる名前を与え、それぞれのオーバーロードされたSQL関数のふさわしいC言語実装を選択するためにCREATE FUNCTION構文の中で AS句の代替形式を使います。

同一オブジェクトファイルを参照する、CREATE FUNCTION 呼び出しが繰り返された場合、そのファイルは一度だけロードされます。(おそらく開発段階で)ファイルをアンロードし再ロードするには、 LOAD を使用します。

ユーザ定義の関数を削除するには DROP FUNCTION を使用します。

既存の関数定義を更新するには、 CREATE OR REPLACE FUNCTION を使用します。この方法では関数の名前や引数の型を変更することはできないことに注意して下さい。(これを行なった場合、新しい別の関数が作成されるだけです。)また、CREATE OR REPLACE FUNCTION では、既存関数の戻り値の型を変更させることはできません。このためには、その関数を削除し、再度作成して下さい。

関数を削除し再作成した場合、新しい関数は古いものと同じ実体にはなりません。古い関数を参照する、既存のルール、ビュー、トリガなどは壊れてしまいます。関数を参照するオブジェクトを破壊しないように、関数定義を変更するには CREATE OR REPLACE FUNCTION を使用します。

単純なSQL関数を作成するには以下のようにします。

CREATE FUNCTION one() RETURNS integer
    AS 'SELECT 1 AS RESULT;'
    LANGUAGE SQL;

SELECT one() AS answer;
 answer 
--------
      1

次の例は、ユーザ作成の(拡張子はプラットフォームによって大きく変わる)funcs.soという名前の共有ライブラリからルーチンを呼び出すことにより C 関数を作成します。共有ライブラリファイルはサーバの動的ライブラリ検索パスから検索されます。その特定のルーチンは桁数を検査し、パラメータとして渡される値と等しければ、TRUE を返します。これは CHECK制約内で使用されることを意図しています。

CREATE FUNCTION ean_checkdigit(char, char) RETURNS boolean
    AS 'funcs' LANGUAGE C;
    
CREATE TABLE product (
    id        char(8) PRIMARY KEY,
    eanprefix char(8) CHECK (eanprefix ~ '[0-9]{2}-[0-9]{5}')
                      REFERENCES brandname(ean_prefix),
    eancode   char(6) CHECK (eancode ~ '[0-9]{6}'),
    CONSTRAINT ean    CHECK (ean_checkdigit(eanprefix, eancode))
);

この例は、complex ユーザ定義型とpoint 内部型間での型変換を行なう関数を作成します。この関数は C のソースからコンパイルされた動的にロードされるオブジェクトによって実装されています。(共有オブジェクトファイルのパス名を正確に指定するという、現在は勧められない方法を説明しています。) PostgreSQL に型変換関数を自動的に検出させるために、この SQL 関数は戻り型と同じ名前を持たなければなりませんので、オーバーロードは避けることができません。関数名は SQL 定義中の AS 句の 2 番目の形式を使ってオーバーロードされます。

CREATE FUNCTION point(complex) RETURNS point
    AS '/home/bernie/pgsql/lib/complex.so', 'complex_to_point'
    LANGUAGE C;

関数の C 宣言は以下のようになります。

Point * complex_to_point (Complex *z)
{
	Point *p;

	p = (Point *) palloc(sizeof(Point));
	p->x = z->x;
	p->y = z->y;
		
	return p;
}

互換性

CREATE FUNCTION コマンドは SQL99 で定義されています。 PostgreSQL 版は似てはいますが、互換性はありません。属性は移植性がなく、また、使用可能な言語も異なります。

関連項目

DROP FUNCTION , LOAD, PostgreSQL プログラマガイド