無料スクリプト配布のPHP.TO   PHPの実用的なtips PHPマニュアル MySQLマニュアル Apacheマニュアル PostgreSQLマニュアル マニュアル検索    

40.1. 概要

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

関連する例は 項40.3.1 および 項40.6.1 にあります。


powered by SEO.CUG.NET