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