Postgresでは、関数やプロシージャを 書くために新たなプログラミング言語を追加することが可能です。 これらは手続き言語(PL)と呼ばれています。 手続き言語で関数やトリガか記述されていた場合、データベースサーバは その関数のソースを理解する能力がありません。代わりに、 そのタスクはその言語を解釈する特別なハンドラーに引き渡します。 そのハンドラは解析、シンタックス分析、実行などすべてのことを 行うこともできますし、Postgresと 存在するプログラミング言語の実装との橋渡しともなり得ます。 ハンドラそのものは特別なプログラミング言語関数で、共有オブジェクトに コンパイルされ、要求に応じて呼び出されます。
新しい手続き言語のハンドラを作成する方法はこのマニュアル外の こととなりますが、CREATE LANGUAGEのページで少々記述されています。 いくつかの手続き言語はPostgresの 標準ディストリビューションに付随しています。
手続き言語は、それらが使用されるデータベースすべてに "インストール"されている必要があります。 しかし、template1にインストールされた手続き言語は その後に作成されたデータべースで自動的に使用できます。 したがって、データベース管理者はどのデータベースに どの言語を使用するかを決定できますし、ディフォルトで 使用できる言語も決定できます。
標準ディストリビューションで入っている言語に関しては、手動で実行するのではなく、 シェルスクリプトでcreatelangを使用することが できます。例えば、PL/pgSQLをtemplate1のデータベースにインストールする には、下記のように実行して下さい。
createlang plpgsql template1下記はcreatelangが認識できない言語に対して のみ使用することをお勧めします。
手続き言語のインストール方法
手続き言語は、データベースのスーパーユーザによって、 次の3段階でデータベースにインストールすることができます。
まず、その言語のハンドラ用の共有オブジェクトがコンパイルされ、 インストールされている必要があります。これはCで書かれたユーザ定義関数 を作成してインストールする時と同じです。Section 13.4.6を ご覧下さい。
ハンドラは下記のコマンドで定義されなければなりません。
CREATE FUNCTION handler_function_name () RETURNS OPAQUE AS 'path-to-shared-object' LANGUAGE 'C';OPAQUEという特別な戻り値の型を持っている関数は、 定義済みのSQLの型を返さず、SQL文 では直接使用できないことをデータベースに伝えます。
PLは下記のコマンドで宣言されなければいけません。
CREATE [TRUSTED] [PROCEDURAL] LANGUAGE 'language-name' HANDLER handler_function_name LANCOMPILER 'description';TRUSTEDというオプションキーワードは、 スーパーユーザの権利を持たない一般ユーザがこの言語を使って関数や トリガプロシージャを作成できるかどうかを知らせます。 PL 関数はデータベースバックエンドの内部で実行されますので、 TRUSTEDはデータベースバックエンド内部や ファイルシステムへのアクセスを持たない言語のみが使われるべきです。 PL/pgSQLとPL/Tclでは使用できることが確認できています。 PL/TclUでは使用しないで下さい。
Postgresのデフォルトのインストールでは、 PL/pgSQLのハンドラは"library"ディレクトリに ビルドされ、インストールされています。Tcl/Tkサポートが設定された場合、 PL/TclとPL/TclUのハンドラも同じ場所にビルドされ、インストールされます。 Perlサポートが設定された場合も同様です。createlang スクリプトは上記の2つのCREATE手順を自動に行います。
例
下記のコマンドはデータベースにPL/pgSQL 言語呼び出しハンドラ関数用の共有 オブジェクトがどこにあるかを指定します。
CREATE FUNCTION plpgsql_call_handler () RETURNS OPAQUE AS '/usr/local/pgsql/lib/plpgsql.so' LANGUAGE 'C';
CREATE TRUSTED PROCEDURAL LANGUAGE 'plpgsql' HANDLER plpgsql_call_handler LANCOMPILER 'PL/pgSQL';そして、上記のコマンドのlanguage属性、'plpgsql'で、 前に宣言された呼び出しハンドラ関数が、関数とトリガプロシージャ用に 呼び出されるべきであることを定義します。