PostgreSQLでは、SQLやC言語以外の言語でユーザ定義の関数を作成することができます。 これらの他の言語は一般に手続き言語 (PL)と呼ばれます。 手続き言語で関数が記述されていた場合、データベースサーバにはその関数のソースを理解する能力が組み込まれていません。 代わりに、その処理はその言語を解釈する特別なハンドラに引き渡されます。 そのハンドラは解析、構文分析、実行など全てのことを行うこともできますし、PostgreSQLと存在するプログラミング言語の実装との"橋渡し"ともなり得ます。 ハンドラそのものはC言語関数で、他のC言語関数と同様に、共有オブジェクトにコンパイルされ、要求に応じてロードされます。
現在PostgreSQLの標準配布物では、PL/pgSQL (第35章)、PL/Tcl (第36章)、PL/Perl (第37章)、PL/Python (第38章)という4つの手続き言語があります。 ユーザは他の言語を定義することもできます。 新しい手続き言語の開発について、その基礎を第45章で説明します。 複数の手続き言語がPostgreSQLのコア配布物に付随しています。 以下ではこれらの言語を例として使用します。
更に、コア配布物には含まれない手続き言語があります。 付録Hでその見付け方を説明します。
手続き言語は、それらが使用されるデータベース全てに"インストール"されている必要があります。 しかし、template1データベースにインストールされた手続き言語は、template1内の項目はCREATE DATABASEによってコピーされますので、その後に作成された全てのデータべースで自動的に使用できます。 したがって、データベース管理者はどのデータベースにどの言語を使用するかを決定できますし、デフォルトで使用できる言語も決定できます。
標準配布物で提供される言語に関しては、手動で実行するのではなく、createlangプログラムを使用することができます。 例えば、PL/pgSQLをtemplate1データベースにインストールするには、下記のように実行してください。
createlang plpgsql template1
下記の手作業はcreatelangが認識できない独自の言語に対してのみ使用することを推奨します。
手続き言語の手作業によるインストール方法
手続き言語を次の4段階でデータベースにインストールすることができます。 この作業はデータベースのスーパーユーザで行なう必要があります。 createlangプログラムは、ステップ1以外の全てを自動化します。
その言語ハンドラ用の共有オブジェクトがコンパイルされ、適切なライブラリディレクトリにインストールされている必要があります。 これは、通常のユーザ定義のC関数を作成してインストールする時と同じです。 項31.9.6を参照してください。 実際のプログラミング言語エンジンを提供する外部ライブラリに、言語ハンドラが依存していることがよくあります。 この場合はそのライブラリもインストールしなければなりません。
ハンドラは下記のコマンドで宣言されなければなりません。
CREATE FUNCTION handler_function_name() RETURNS language_handler AS 'path-to-shared-object' LANGUAGE C;
language_handlerという特別な戻り値の型は、この関数が定義済みのSQLデータ型を返さず、SQL文では直接使用できないことをデータベースに伝えます。
省略されることもありますが、言語ハンドラが、実際に実行することなく関数定義の正確性を検査する"有効性検査"関数を提供することがあります。 もし存在すれば、有効性検査関数はCREATE FUNCTIONで呼び出されます。 有効性検査関数はハンドラによって提供され、以下のようなコマンドで宣言されます。
CREATE FUNCTION validator_function_name(oid) RETURNS void AS 'path-to-shared-object' LANGUAGE C;
PLは下記のコマンドで宣言されなければいけません。
CREATE [TRUSTED] [PROCEDURAL] LANGUAGE language-name HANDLER handler_function_name [VALIDATOR validator_function_name] ;
TRUSTEDというオプションキーワードは、スーパーユーザ権限を持たない一般ユーザがこの言語を使って関数やトリガプロシージャを作成できるかどうかを指定します。 PL関数はデータベースサーバの内部で実行されますので、TRUSTEDフラグはデータベースサーバ内部やファイルシステムへのアクセスを持たない言語のみが使わなければなりません。 PL/pgSQLとPL/Tcl、PL/Perl言語はTRUSTEDの対象と考えられています。 提供される機能が無制限に設計されているPL/TclU、PL/PerlU、PL/PythonU言語については、TRUSTEDを指定してはなりません。
例34-1に、手作業によるインストール手順がPL/pgSQL言語でどのように動作するかを示します。
例 34-1. PL/pgSQL の手作業によるインストール
以下のコマンドは、データベースサーバにPL/pgSQL言語の呼び出しハンドラ関数用の共有ライブラリの存在場所を通知します。
CREATE FUNCTION plpgsql_call_handler() RETURNS language_handler AS '$libdir/plpgsql' LANGUAGE C;
PL/pgSQLは有効性検査関数を有していますので、以下のようにも宣言できます。
CREATE FUNCTION plpgsql_validator(oid) RETURNS void AS '$libdir/plpgsql' LANGUAGE C;
以下のコマンドは、直前に宣言された関数を、言語属性がplpgsqlである関数やトリガプロシージャ用に呼び出さなければならないことを定義します。
CREATE TRUSTED PROCEDURAL LANGUAGE plpgsql HANDLER plpgsql_call_handler VALIDATOR plpgsql_validator;
デフォルトのPostgreSQLインストレーションでは、PL/pgSQL言語用のハンドラは構築され、"library"ディレクトリにインストールされます。 Tclのサポート付きで構築した場合、PL/TclとPL/TclU用のハンドラも構築され同じ場所にインストールされます。 同様に、Perlサポート付きで構築した場合はPL/PerlとPL/PerlUハンドラが、Pythonサポート付きで構築した場合はPL/PythonUが構築され、インストールされます。