PostgreSQLはSQLだけじゃなくて、他の言語でも「話せる」んだ!紹介するね:PL/pgSQL(Procedural Language/PostgreSQL Structured Query Language)は、PostgreSQLに組み込まれているプロシージャルプログラミング言語だよ。これは、SQLクエリと制御構造(IF、CASEみたいな条件分岐や、LOOP、FOR、WHILEみたいなループ)を使って複雑な操作を簡単にするために作られたんだ。
PL/pgSQLとSQLは、自動化された組立ラインと普通の「手動」ツール(たとえばハンマー)みたいな関係だよ。ハンマー(SQL)は信頼できるツールだけど、毎回自分で振りかぶって叩かないといけない。でもPL/pgSQLは自動組立ラインみたいなもので、一度「何をどうやるか」決めておけば、あとは全部自動でやってくれる。コマンドを実行して、覚えて、チェックして、何か問題があっても落ち着いて続けてくれる。毎回自分で釘を打つより、全部自動でやってくれるのを見てる方が楽じゃない?夢みたいでしょ?
PL/pgSQLと普通のSQLクエリの比較
PL/pgSQLが普通のSQLクエリとどう違うのか、ちょっと見てみよう。
SQLは、特定のタスクを一つだけやりたい時にはめっちゃ便利。たとえば、テーブルから全ての学生を選ぶとか、新しい行を追加するとか。でも、「もしこうなら、こうする」みたいなロジックや、同じ操作を何度も繰り返す必要が出てくると、SQLだけだとちょっと困ることがあるんだ。
たとえば、こんなことをやりたいとき:
- テーブルにその学生のレコードがあるかチェックする。
- もしレコードがあれば、データを更新する。
- もしレコードがなければ、新しいレコードを追加する。
普通のSQLだと、いくつかクエリを書いて、クライアント側で結果を処理しないといけない。でもPL/pgSQLなら、これ全部を一つのプロシージャにまとめて、データベース側で実行できるんだ。
PL/pgSQLは、もっと複雑なプロジェクトで本領発揮するよ。たとえば:
- 途中の結果を変数に保存できる;
- エラー処理ができて、予期しないことが起きてもデータベースが「落ちない」ようにできる;
- ループや条件分岐を使って、複雑なアルゴリズムも書ける。
PL/pgSQLの使いどころ
PL/pgSQLは、こんなシナリオでよく使われてるよ:
タスクの自動化。 たとえば、データが更新されるたびに自動で
logテーブルにレコードを作るとか。ビジネスロジック。 たとえば、「欠席が5回以上の学生は自動的に'非アクティブ'にする」みたいなルールがあるなら、それをPL/pgSQLの関数にしちゃえばいいよね。
分析やレポート。 データベースとクライアントアプリの間でデータを行ったり来たりさせる代わりに、サーバー側で集計しちゃおう。
トリガー。 PL/pgSQLは、データの挿入・更新・削除時に自動で何かを実行するトリガーを書くのにも使われるよ。
PL/pgSQLの使い方例
こんな感じで、2つの数字を受け取って足し算して結果を返す関数の例を見てみよう:
CREATE FUNCTION add_numbers(a INT, b INT) RETURNS INT AS $$
BEGIN
RETURN a + b;
END;
$$ LANGUAGE plpgsql;
解説:
CREATE FUNCTION add_numbers(a INT, b INT)—add_numbersという名前の関数を作って、INT型(整数)の引数を2つ受け取るよ。RETURNS INT— この関数は整数を返すってこと。BEGIN ... END— ここがメインの処理ブロックで、関数のロジックを書く場所。RETURN a + b;— 足し算の結果を返してる。
この関数を呼び出すには、普通のSQLクエリを使えばOK:
SELECT add_numbers(10, 20);
結果:30。
落とし穴と制限
PL/pgSQLは強力なツールだけど、ちょっと注意も必要:
- パフォーマンス: 複雑すぎる関数はデータベースを遅くしちゃうことも。ちゃんとテスト&最適化しよう。
- テスト: 関数の中のバグは、呼び出すまで気づかないこともある。テストは忘れずに!
- 読みやすさ: 複雑なロジックの大きな関数やプロシージャは、後から読むのが大変。1ヶ月後に自分で読んでも分かるコードを書こう。
これでPL/pgSQLがどんなものか、ちょっと分かってきたよね。次は、PL/pgSQLの構文や基本機能について話していくよ。これから、コードブロックの作り方、変数の宣言、データ型の扱い方などを学んでいこう。データベース側でのプログラミング、いざスタート!
GO TO FULL VERSION