CREATE FUNCTION

Name

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

Synopsis

CREATE FUNCTION name ( [ ftype [, ...] ] )
    RETURNS rtype
    AS definition   
    LANGUAGE 'langname'
    [ WITH ( attribute [, ...] ) ]
CREATE FUNCTION name ( [ ftype [, ...] ] )
    RETURNS rtype
    AS obj_file , link_symbol  
    LANGUAGE 'langname'
    [ WITH ( attribute [, ...] ) ]
  

入力

name

作成する関数の名前です。

ftype

もしあれば、関数の引数のデータ型です。入力型は基本、 複雑型、もしくは opaque を 使うことができます。Opaque は その関数が char * のような非 SQL 型の 引数を受けつけることを示します。

rtype

返されるデータ型です。出力の型は基本型、複合型、 setof type、もしくは opaque を返すことができます。修飾子 setof はその関数が、一つのアイテムではなくアイテムの集合を 返すことを示します。

attribute

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

definition

関数を定義する文字列です。その意味は言語によって異なります。 内部関数の名前、オブジェクトファイルへのパス、SQL 問い合わせ、 もしくは手続き言語のテキストを指定できます。

obj_file , link_symbol

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

langname

'plname' が作成された 手続き言語の名前であるときは 'sql', 'C', 'internal', もしくは 'plname' を指定できます。詳細は CREATE LANGUAGE を見て下さい。

出力

CREATE

コマンドが問題無く終了するとこのメッセージが返されます。

説明

CREATE FUNCTION によって Postgres ユーザがデータベースに 関数を登録することができます。続いて、このユーザは その関数の所有者であるとみなされます。

関数の属性

以下のアイテムは WITH 句の中で使われることがあります。

iscachable

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

isstrict

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

注釈

更に詳しい外部関数の書き方については PostgreSQL プログラマガイド の 関数を使った Postgres の拡張 のトピックの章を参照して下さい。

ユーザ定義関数を削除するためには DROP FUNCTION を使います。

SQL92 の型の構文は入力引数と返り値に 認められています。しかし、型指定のいくつかの細部(例えば numeric 型の精度フィールド)は根底にある関数の 実装の責任であり、CREATE FUNCTION コマンド によって静かに飲み込まれます (つまり認識や強制されません)。

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

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

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

使用方法

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

CREATE FUNCTION one() RETURNS int4
    AS 'SELECT 1 AS RESULT'
    LANGUAGE 'sql';
SELECT one() AS answer;

     answer 
--------
      1
    
   

この例はユーザ作成の共有ライブラリからルーチンを呼び出すことにより C 関数を作成します。この特定のルーチンはチェック桁数を計算し、 もし巻数パラメータ中のチェック桁数が正しければ TRUE を返します。 これは CHECK 制約の中で使われることが意図されています。

CREATE FUNCTION ean_checkdigit(bpchar, bpchar) RETURNS boolean
    AS '/usr1/proj/bray/sql/funcs.so' 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 のソースからコンパイル された動的にロードされるオブジェクトによって実装されています。 Postgres が型変換関数を自動的に 見つけるためには、SQL 関数が返り値の型と同じ名前を持っていなければ ならないため、オーバーロードは避けることができません。その関数名 は SQL 定義中の AS 句の二番目の形式を 使ってオーバーロードされます。

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

互換性

SQL92

CREATE FUNCTIONPostgres の言語拡張です。

SQL/PSM

Note: PSM は Persistent Stored Modules の略です。これは 手続き言語であり、もともとは PSM は 1996 年までには公式な標準 として批准されることが望まれていました。1998 の中ごろの 時点ではまだそうなっていませんが、PSM がいずれは標準に なることが望まれています。

SQL/PSM CREATE FUNCTION has the following syntax:
CREATE FUNCTION name
    ( [ [ IN | OUT | INOUT ] type [, ...] ] )
     RETURNS rtype
     LANGUAGE 'langname'
     ESPECIFIC routine
     SQL-statement