こんにちは!データベースの世界へようこそ。
PostgreSQLを触っていると、「もっと複雑な処理を自動化したいな」と思う瞬間が必ずやってきますよね。そんなとき、SQLの命令文だけでは力不足を感じることも多いはず。
そこで登場するのが、PostgreSQLの強力な武器「PL/pgSQL」です。これを使うと、まるでプログラミングをするように、データベースの中で「もし〜なら、こうする」といった柔軟な動きを作れるようになります。
今日は、その基本中の基本である「変数」と「データ型」について、肩の力を抜いてお話ししますね。
—
変数は「中身を出し入れできる箱」
PL/pgSQLで最もよく使うのが「変数」です。これは、「一時的に情報を入れておくための箱」だと思ってください。
例えば、計算結果を一時的に置いておいたり、ユーザーの名前を記憶しておいたり。この「箱」に名前をつけて、中身を出し入れしていくのが基本スタイルです。
宣言と代入の作法
箱を使うには、まず「どんな箱を使うか」を宣言する必要があります。
DO $$
DECLARE
user_age INTEGER := 25; — 整数を入れる「user_age」という箱を用意
BEGIN
— ここで何か処理をする
END $$;
ここで注目してほしいのは `:=` という記号です。多くのプログラミング言語では `=` を使いますが、PL/pgSQLでは「代入しますよ!」という意思表示として `:=` を使うのがルールなんです。ちょっとしたこだわりですね。
—
賢い開発者は「動的」に型を決める(%TYPEと%ROWTYPE)
さて、ここからが少し「エンジニアっぽい」お話です。
普通、変数は「数字を入れる」「文字を入れる」と最初に決めておきますよね。でも、もしテーブルの定義が変わって、年齢を入れる箱の桁数が増えたらどうしますか?いちいち修正するのは面倒だし、ミスのもとです。
そんなとき、PostgreSQLには「そのテーブルの列と同じ型にしてね」と丸投げできる便利な機能があるんです。
1. %TYPE:特定の列に合わせる
「この変数は、usersテーブルのage列と同じ型にして!」と指示できます。
DECLARE
user_age users.age%TYPE;
これなら、もし後から `age` が整数から文字に変わっても、コードを書き直す必要はありません。賢いですよね。
2. %ROWTYPE:テーブルの「行」を丸ごと抱える
テーブルの列が10個も20個もあったら、全部の型を宣言するのは大変です。そんなときは「この箱はusersテーブルの1行分そのものだよ!」と宣言してしまいましょう。
DECLARE
user_record users%ROWTYPE;
こうすると、`user_record.name` や `user_record.email` のように、テーブルの項目をそのままドットで繋いで呼び出せるようになります。まるで魔法みたいでしょう?
—
知っておきたい「スコープ」の境界線
最後に、少しだけ「スコープ(変数の有効範囲)」についても触れておきますね。
変数は、「宣言したブロックの中」でしか生きられません。例えば、大きな処理の中に小さなブロックを作った場合、外側で作った変数は内側で使えますが、内側で作った変数は外側からは見えません。
これは、お家の中で例えると分かりやすいかも。
- リビング(外側)で決めたルールは、子ども部屋(内側)でも通用する。
- 子ども部屋(内側)専用の箱は、リビングからは見えない。
この「見えない場所がある」というルールのおかげで、プログラムが複雑になっても名前の衝突が起きず、安全に動くようになっているんです。
—
さいごに
いかがでしたか?
「変数」と聞くと難しく感じるかもしれませんが、要は「情報の整理整頓」のための道具です。
まずはあまり深く考えず、`DECLARE` で箱を用意して、`:=` で物を入れてみる。それだけでも、SQLの世界がグッと広がるはずですよ。
もし途中でエラーが出ても、それはデータベースが「もう少し詳しく教えて!」と言っているだけ。怖がらずに、ぜひ色々と試してみてくださいね。
それでは、また次回の記事でお会いしましょう!Happy Coding!
コメント