PL/pgSQLは、PostgreSQLデータベースシステム用の読み込み可能な手続き言語です。 PL/pgSQLの設計目的は、次のような読み込み可能な手続き言語でした。
関数とトリガを作成するために使用できること
SQL言語に制御構造を追加すること
複雑な演算が可能であること
全てのユーザ定義型、関数、演算子を継承すること
サーバによって信頼できるものと定義できること
使いやすいこと
PL/pgSQLで作成した関数は、組み込み関数が使えるところであれば、どこでも使用できます。 例えば、複雑な条件のある演算処理関数の作成が可能ですし、作成した関数を使用して演算子を定義することも、インデックス式にその関数を使用することも可能です。
PostgreSQL 9.0以降ではPL/pgSQLはデフォルトでインストールされます。 しかしこれはまだロード可能なモジュールですので、特にセキュリティに厳しい管理者は削除することもできます。
SQLはPostgreSQLおよびその他のほとんどのリレーショナルデータベースが問い合わせ言語として使用している言語です。 移植性があり、習得が容易です。 しかし、あらゆるSQL文はデータベースサーバによって個々に実行されなければいけません。
これはクライアントアプリケーションに対して以下のようなことを要求しています。 まず、データベースサーバに問い合わせを送信します。 次にそれが処理されるのを待ちます。 次に、結果を取得して処理します。 次に若干の計算を行います。 そして、サーバに次の問い合わせを送信します。 クライアントがデータベースサーバマシンと異なるマシンの場合、これが招いたプロセス間通信により、ネットワークオーバーヘッドを起こすでしょう。
PL/pgSQLを使うことで、計算と複数の問い合わせをデータベースサーバ内部でひとまとめに実行することができます。 このように、手続き言語の能力とSQLの使いやすさを持ち合わせているにもかかわらず、クライアント/サーバ通信のオーバーヘッドをかなり節約できます。
クライアント・サーバ間の余計なやり取りを排除する。
クライアントサーバ間において、クライアントに不必要な中間結果の整理と転送を不要とする。
一連の問い合わせに、複数の解析が不要である。
これにより、ストアドプロシージャを使用しないアプリケーションに比較して、かなり性能を向上させることができます。
また、PL/pgSQLではSQL全てのデータ型、演算子、関数を使用することができます。
PL/pgSQLで作成された関数は、サーバでサポートされる任意のスカラデータ型や配列データ型を引数として受け付けることができ、また、これらの型を結果として返すことができます。
また、任意の、名前で指定された複合型(行型)を受け付けたり、返したりすることもできます。
さらに、7.2.1.4で説明されているように、PL/pgSQL関数がrecord
を受け入れるように、すなわち、任意の複合型を入力としたりrecord
を返すように宣言することも可能です。record
を返す場合の結果は、その各列が呼び出す問い合わせの中での指定で決まる行型です。
PL/pgSQL関数はVARIADIC
記号を使用して可変長の引数を受け付けられるように宣言することができます。
これは38.5.5で論議したように、SQL関数と全く同じ方法で動作します。
また、PL/pgSQL関数を、anyelement
、anyarray
、anynonarray
、anyenum
、anyrange
多様型を受け付けたり、返したりするように宣言することもできます。
38.2.5の説明の通り、多様型関数で扱われる実際のデータ型は呼び出しごとに変動することができます。
例を43.3.1に示します。
PL/pgSQL関数は、1つのインスタンスとして返すことができる任意のデータ型の「集合」(テーブル)を返すように宣言できます。
こうした関数は、結果集合の必要な要素に対してRETURN NEXT
を実行すること、または問い合わせの評価結果を得るためにRETURN QUERY
を使用することで、その出力を生成します。
最後に、有用な戻り値を持たない場合、PL/pgSQL関数は、void
を返すように宣言することができます。
(あるいは、この場合はプロシージャとして書くこともできます)
PL/pgSQL関数は戻り値の型を明確に指定する代わりに、出力パラメータと共に宣言することもできます。
これは言語に対して基本的な能力を追加するものではありませんが、特に複数の値を返す時にしばしば便利です。
RETURNS TABLE
表記はRETURNS SETOF
の代わりとして使用できます。