他のバージョンの文書 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

41.1. 概要

PL/pgSQLは、PostgreSQLデータベースシステム用の読み込み可能な手続き言語です。 PL/pgSQLの設計目的は、次のような読み込み可能な手続き言語でした。

PL/pgSQLで作成した関数は、組み込み関数が使えるところであれば、どこでも使用できます。 例えば、複雑な条件のある演算処理関数の作成が可能ですし、作成した関数を使用して演算子を定義することも、インデックス式にその関数を使用することも可能です。

PostgreSQL 9.0以降ではPL/pgSQLはデフォルトでインストールされます。 しかしこれはまだロード可能なモジュールですので、特にセキュリティに厳しい管理者は削除することもできます。

41.1.1. PL/pgSQLを使用することの利点

SQLPostgreSQLおよびその他のほとんどのリレーショナルデータベースが問い合わせ言語として使用している言語です。 移植性があり、習得が容易です。 しかし、あらゆるSQL文はデータベースサーバによって個々に実行されなければいけません。

これはクライアントアプリケーションに対して以下のようなことを要求しています。 まず、データベースサーバに問い合わせを送信します。 次にそれが処理されるのを待ちます。 次に、結果を取得して処理します。 次に若干の計算を行います。 そして、サーバに次の問い合わせを送信します。 クライアントがデータベースサーバマシンと異なるマシンの場合、これが招いたプロセス間通信により、ネットワークオーバーヘッドを起こすでしょう。

PL/pgSQLを使うことで、計算と複数の問い合わせをデータベースサーバ内部でひとまとめに実行することができます。 このように、手続き言語の能力とSQLの使いやすさを持ち合わせているにもかかわらず、クライアント/サーバ通信のオーバーヘッドをかなり節約できます。

  • クライアント・サーバ間の余計なやり取りを排除する。

  • クライアントサーバ間において、クライアントに不必要な中間結果の整理と転送を不要とする。

  • 一連の問い合わせに、複数の解析が不要である。

これにより、ストアドプロシージャを使用しないアプリケーションに比較して、かなり性能を向上させることができます。

また、PL/pgSQLではSQL全てのデータ型、演算子、関数を使用することができます。

41.1.2. 引数と結果データ型のサポート

PL/pgSQLで作成された関数は、サーバでサポートされる任意のスカラデータ型や配列データ型を引数として受け付けることができ、また、これらの型を結果として返すことができます。 また、任意の、名前で指定された複合型(行型)を受け付けたり、返したりすることもできます。 さらに、7.2.1.4. テーブル関数で説明されているように、PL/pgSQL関数がrecordを返すように宣言することも可能で、この場合、結果は行型で、その列は呼び出す問い合わせの中での指定で決まります。

PL/pgSQL関数はVARIADIC記号を使用して可変長の引数を受け付けられるように宣言することができます。 これは36.4.5. 可変長引数を取るSQL関数で論議したように、SQL関数と全く同じ方法で動作します。

また、PL/pgSQL関数を、anyelementanyarrayanynonarrayanyenumanyrange多様型を受け付けたり、返したりするように宣言することもできます。 36.2.5. 多様型の説明の通り、多様型関数で扱われる実際のデータ型は呼び出しごとに変動することができます。 例を41.3.1. 関数引数の宣言に示します。

PL/pgSQL関数は、1つのインスタンスとして返すことができる任意のデータ型の集合(テーブル)を返すように宣言できます。 こうした関数は、結果集合の必要な要素に対してRETURN NEXTを実行すること、または問い合わせの評価結果を得るためにRETURN QUERYを使用することで、その出力を生成します。

最後に、有用な戻り値を持たない場合、PL/pgSQL関数は、voidを返すように宣言することができます。

PL/pgSQL関数は戻り値の型を明確に指定する代わりに、出力パラメータと共に宣言することもできます。 これは言語に対して基本的な能力を追加するものではありませんが、特に複数の値を返す時にしばしば便利です。 RETURNS TABLE表記はRETURNS SETOFの代わりとして使用できます。

関連する例は41.3.1. 関数引数の宣言および41.6.1. 関数からの復帰にあります。