CREATE FUNCTION name ( [ ftype [, ...] ] ) RETURNS rtype AS definition LANGUAGE 'langname'
CREATE FUNCTION は Postgres ユーザが あるデータベースに関数を登録する許可を与えます。 その後、そのユーザは関数の所有者として取り扱われます。
より詳しくは PostgreSQL プログラマガイドの 関数についての章を参照して下さい。
ユーザ定義関数を削除するには DROP FUNCTION を使用します。
Postgres では関数の "オーバロードを 行うこと"、すなわち、引数の型が別のものであるかぎり、複数の関数に 同じ名前を付けることができます。とは言っても、 INTERNAL と C 言語 関数の取り扱いには注意が必要です。
リンク時にエラーを発生させない様にして 2 つの INTERNAL 関数に同じ C 名を付けることは出来ません。このことを予防するためには、異なった C 名を(例えば、C 名の一部として引数の型を使うといったような) 付けたうえで、CREATE FUNCTION の AS 句でそれらの 名前を指定するようにします。AS 句に何の指定もないと、 CREATE FUNCTION は 関数の C 名を SQL と同じ名前と想定してしまいます。
動的に読み込まれる C 関数に対して、その関数の SQL 名は C 関数名と同じでなければなりません。というのは、AS 句は C コード を含んでいるオブジェクトファイルのパス名を与えるために使用される からです。この状況において、同じ SQL 関数名をオーバロードしない ようにすることが賢明です。ある内部関数または他の動的読み込み関数 と同じ C 名を持つ C 関数を読み込ませても作動する可能性がありますが、 保証の限りではありません。 いくつかのプラットフォームで動的ローダは、C 関数名が相容れない 時に、奇妙な形で読み込みをやりそこないます。ですから、今現在 (正常に)動いていると言っても、そのコードを別のどこかで走らせようと した場合、同じ名前をオーバロードしたことを後悔するかもしれません。
単純な 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 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)) );
CREATE FUNCTION は Postgres の拡張言語です。
Note: PSM は Persistent Stored Module (永続的内蔵モジュール) の省略形です。それは手続き言語で、1996 年の後半には PSM が 公式の標準として認められると当初期待されていました。 1998 年の中程になっても期待通りになっていませんが、 最終的には、標準となって欲しいと望まれます。
CREATE FUNCTION name ( [ [ IN | OUT | INOUT ] etereable>eable> type [, ...] ] ) RETURNS rtype LANGUAGE 'langname' ESPECIFIC routine SQL-statement