CREATE LANGUAGE — 新しい手続き言語を定義する
CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGEname
HANDLERcall_handler
[ INLINEinline_handler
] [ VALIDATORvalfunction
] CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGEname
CREATE LANGUAGE
は新しい手続き言語をPostgreSQLデータベースに登録します。
この後で、関数とプロシージャをその新しい言語で定義できるようになります。
CREATE LANGUAGE
は、言語名とその言語で作成された関数の実行に責任を持つハンドラ関数を関連付けます。
言語ハンドラについての詳細は、第56章を参照してください。
CREATE OR REPLACE LANGUAGE
は新しい言語を作成、または、既存の定義を置き換えます。
言語がすでに存在する場合、パラメータはコマンドに従って更新されますが、言語の所有権と権限に関する設定は変更されません。
また、その言語で作成された既存の関数も依然として有効であるものとみなされます。
新しい言語を登録する、または、既存の言語のパラメータを変更するには、ユーザはPostgreSQLのスーパーユーザ権限を持たなければなりません。 しかし、言語が一度作成されれば、その所有権を非スーパーユーザに割り当てたり、そのユーザが削除したり、権限を変更したり、新しい所有者に割り当てたりすることは有効です。 (しかしながら、基本的なC関数の所有権を非スーパーユーザに割り当てないでください。それは、そのユーザに権限昇格パスを作ることになるでしょう。)
ハンドラ関数を指定しない形式のCREATE LANGUAGE
は廃止されました。
古いダンプファイルとの後方互換性のため、CREATE EXTENSION
と解釈されます。
言語が同じ名前の拡張としてパッケージ化されていれば問題なく動作するでしょう、そしてそのようなパッケージ化は手続き言語を設定するのによく行なわれている方法です。
TRUSTED
TRUSTED
は、他の方法ではユーザがアクセスできないデータに対しては、その言語でのアクセスが許されないことを指定します。
言語の登録時にこのキーワードを省略すると、PostgreSQLのスーパーユーザ権限を持つユーザのみが、この言語を使って新しい関数を作れるようになります。
PROCEDURAL
これには意味はありません。
name
新しい手続き言語の名前です。 この名前はデータベースの言語の中で一意でなければなりません。
HANDLER
call_handler
call_handler
は手続き言語の関数を実行するために呼び出される関数の名前で、事前に登録しておく必要があります。
このハンドラは、Version-1呼び出し規約に則って、C言語のようなコンパイル言語で書かれている必要があります。また、引数を取らずlanguage_handler
型を返す関数として、PostgreSQLに登録されていなければなりません。
language_handler
型は、単に関数を呼び出しハンドラとして識別するのに使用するプレースホルダ型です。
INLINE
inline_handler
inline_handler
はこの言語で無名コードブロックを実行(DO
コマンド)するために呼び出される、事前に登録された関数の名前です。
inline_handler
関数が指定されない場合、その言語では無名コードブロックをサポートしません。
このハンドラ関数は、DO
コマンドの内部表現となるinternal
型の引数を1つ取らなければならず、また、通常void
を返します。
ハンドラの戻り値は無視されます。
VALIDATOR
valfunction
valfunction
は、事前に登録された検証用関数の名前です。新しい関数が当該言語で作成された場合、その関数を検証するために呼び出されます。
検証用関数が指定されていない場合、新しい関数は作成時にチェックされません。
検証用関数は、oid
型の引数を1つ取る必要があります。
この引数は作成される関数のOIDになります。
また、通常void
型を返します。
検証用関数は、通常、関数本体が構文上正しいかどうかを検査するために使用されます。
しかし、それだけでなく、関数のプロパティも検査可能です。例えば、その言語が処理できない特定のデータ型が引数に含まれていないかなどがチェックできます。
エラーを通知するには、検証用関数でereport()
関数を使用すべきです。
関数の戻り値は無視されます。
手続き言語を削除するにはDROP LANGUAGE
を使用してください。
システムカタログpg_language
( 52.29参照)には、現在インストールされている言語に関する情報が記録されています。
またpsqlのコマンド\dL
はインストールされた言語を一覧表示します。
手続き言語で関数を作成するには、ユーザはその言語に対するUSAGE
権限を持たなければなりません。
デフォルトでは、信頼された言語についてはPUBLIC
に(つまり全員に)USAGE
が付与されています。
これは必要に応じて取り消すことができます。
手続き言語は各データベースに局所的です。
しかし、言語をtemplate1
データベースにインストールすることができます。
この場合、その後に作成されたすべてのデータベースで自動的にその言語は使用できるようになります。
新しい手続き言語を作成する最小の手順は以下の通りです。
CREATE FUNCTION plsample_call_handler() RETURNS language_handler AS '$libdir/plsample' LANGUAGE C; CREATE LANGUAGE plsample HANDLER plsample_call_handler;
通常、これは拡張の作成スクリプト内に書かれており、ユーザは拡張をインストールすることでこれをすることになるでしょう。
CREATE EXTENSION plsample;
CREATE LANGUAGE
はPostgreSQLの拡張です。