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 'C'
    [ WITH ( attribute [, ...] ) ]
  

入力

name

作成する関数名。

ftype

関数の引数のデータ型。 入力型として、基本型、複合型、もしくは、 opaque をとることができます。 opaque は、その関数が char * といった型として無効な引数を受 け付けることを示します。

rtype

戻り値のデータ型。 出力型として、基本型、複合型、 setof type、 もしくは、opaque を指定すること ができます。 setof 修飾子は関数が一項目ではな く、項目の集合を返すことを示します。

attribute

この関数に関する情報の追加的な部分であり、最適化に使 用されます。 現在、iscachable という属性のみがサ ポートされています。 iscachable は、同じ入力値が与えられ た場合、この関数が常に同じ結果を返す (つまり、データベー ス検索を行なわない、さもなくば、パラメータリストに直接 存在しない情報を使用する)ことを示します。 オプティマイザは iscachable を使用し て、関数呼び出しの事前評価が安全かどうか認知します。

definition

関数を定義する文字列。文字列の意味は使用する言語に依 存します。 内部関数名であったり、オブジェクトファイルのパス、SQL 問い合わせ、手続き言語で記述されたテキストであったり します。

obj_file , link_symbol

AS 句のこの形式は、動的にリンクされ た C 言語関数が、C 言語ソースコード内の関数名と SQL 関 数名が異なる場合に使用されます。 obj_file 文字列は動的読み込みされるオブジェクトを持つファイル名 であり、 link_symbol 文字列は、C 言語ソースコードにおける関数名と同一である、 オブジェクトのリンクシンボルです。

langname

'C'、'sql'、 'internal'、もしくは、 'plname' を取ることができます。ここで、 plname は作成済みの手続き言語の名前です。 詳細については、 CREATE LANGUAGE を参照して下さい。

出力

CREATE

コマンドの実行に成功した場合に返されます。

説明

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

注意

外部関数作成に関するより詳しい情報については PostgreSQL Programmer's Guide の「関数を使用した Postgres の拡張」の項を参照して下さい。

ユーザ定義の関数を削除する場合は DROP FUNCTION を使用して下さい。

Postgres では関数の "オーバー ロード"が可能です。 つまり、関数が別々の引数型を持っている限り、複数の異なる 関数に同じ名前を使用することができます。 しかし、internal 関数と C 言語関数に対 しては、この機能を注意深く使用しなければなりません。

全ての SQL92 における型の構文を、入力引 数と戻り値用に使用することができます。 しかし、(numeric 型の精度フィールドといった) 型指定の細部は、背後にある関数の実装に依存する所や、 CREATE FUNCTION コマンドによって警告無しに (認識できない場合や強要される場合など)取り消されてしまうこと があります。

2 つの internal 関数が、リンク時にエラー が起こることなく同一の C の名前を持つことはできません。 これを回避するには、異なる C の名前を(例えば、引数型を C の 名前に含めるなどして)付与し、この名前を CREATE FUNCTION の AS 句に指定して下さい。 AS 句 の左側が空であれば、CREATE FUNCTION は C の関数名と その SQL の関数名が同一であるとみなします。

C 言語関数を使用して SQL 関数のオーバーロードを行なう場合、 各 C 言語関数のインスタンスに別々の名前を付与し、 CREATE FUNCTION 構文における AS 句の別形式を使用して、確実に オーバー ロードする SQL 関数名が正確な動的リンクされたオブジェクトで 解決できるようにして下さい。

C 関数は値の集合を返すことができません。

使用法

簡単な SQL 関数を作成します。

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

     answer 
--------
      1
    
   

これは、ユーザが作成した共有ライブラリから関数を呼び出すこ とによって C 関数を作成する例です。 この特定の関数は検査用数字を作成し、関数パラメータの検査用 数字と一致する場合に TRUE を返すものです。 検査制約での使用を予定したものです。

CREATE FUNCTION ean_checkdigit(bpchar, bpchar) RETURNS bool
    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 句 の 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;
}
  

互換性

SQL92

CREATE FUNCTIONPostgres の拡張言語です。

SQL/PSM

Note: PSM とは Persistent Stored Modules (永続的内蔵モジュール) の省略形です。 これは手続き言語であり、1996 年の後半には PSM が 公式の標準として認められると当初期待されていました。 1998 年の中程になっても期待通りになっていませんが、 最終的には、標準となることが望まれています。

SQL/PSM CREATE FUNCTION には以下の構 文があります。
CREATE FUNCTION name
    ( [ [ IN | OUT | INOUT ] type [, ...] ] )
     RETURNS rtype
     LANGUAGE 'langname'
     ESPECIFIC routine
     SQL-statement