このレクチャーでは、PL/pgSQLでサポートされているデータ型について見ていくよ。特に次の4つのデータ型にフォーカスするね:
INTEGER― 数値を扱うときに使う。TEXT― 文字列を扱うときに使う。BOOLEAN― 論理値を扱うときに使う。RECORD― 動的なデータ構造を扱うときに使う。
それぞれのデータ型を実際の例で見ていくから、使い方がイメージしやすいはず!
PL/pgSQLでサポートされているデータ型
PL/pgSQLは、PostgreSQLでおなじみのデータ型を全部サポートしてるよ。シンプルな数値型(INTEGER、NUMERIC)から、配列やJSONBみたいな複雑なものまで。主なものをざっと見てみよう。
プリミティブ型:
INTEGER、BIGINT、FLOAT、NUMERIC― 数値型。TEXT、CHAR、VARCHAR― 文字列型。BOOLEAN― 論理型。
複雑な型:
RECORD― 動的なデータセットを扱うための型。ROWTYPE― テーブルの行型を扱うための型。- 配列やJSON ― これはコースの後半でやるよ。
INTEGER型の使い方
INTEGERは一番よく使うデータ型のひとつ。整数を保存するための型だよ。PL/pgSQLでは、計算やレコードIDの管理、条件判定なんかでよく使う。
例:レコード数のカウント
例えば、studentsテーブルがあって、登録されている学生の数を知りたいとき。
DO $$
DECLARE
total_students INTEGER; -- 学生数を保存する変数
BEGIN
SELECT COUNT(*) INTO total_students FROM students; -- クエリの結果を変数に保存
RAISE NOTICE '学生の数: %', total_students; -- メッセージを表示
END;
$$;
INTEGERを使うときのポイント:
- PL/pgSQLでは、変数への値の代入は
INTOキーワードを使うよ。 INTEGERに小数を入れようとするとエラーになるから注意。そういうときはNUMERICやFLOATを使おう。
TEXT型の使い方
TEXTは文字列データを保存するための型。名前や説明文、その他のテキストを扱うときに便利だよ。
例:学生の名前を表示する
この例では、studentsテーブルから全員の名前を表示するよ。
DO $$
DECLARE
student_name TEXT; -- 学生の名前用変数
BEGIN
FOR student_name IN SELECT name FROM students LOOP
RAISE NOTICE '学生の名前: %', student_name; -- 各名前を表示
END LOOP;
END;
$$;
TEXTを扱うときに便利な関数:
UPPER()とLOWER()― 大文字・小文字変換。CONCAT()― 文字列の連結。LENGTH()― 文字列の長さ。
例えば:
DO $$
DECLARE
full_name TEXT;
BEGIN
full_name := CONCAT('アレックス', ' ミン'); -- 文字列を連結
RAISE NOTICE 'フルネーム: %', UPPER(full_name); -- フルネームを大文字で表示
END;
$$;
BOOLEAN型の使い方
BOOLEANは論理値(TRUE、FALSE、NULL)を保存する型。条件判定やデータのフィルタリングで超便利!
例:学生のアクティブ状態をチェック
例えば、studentsテーブルにis_activeカラムがあって、学生がアクティブかどうかを示している場合。
DO $$
DECLARE
is_active BOOLEAN; -- アクティブ状態を保存する変数
BEGIN
SELECT is_active INTO is_active FROM students WHERE id = 1; -- テーブルから値を取得
IF is_active THEN
RAISE NOTICE '学生はアクティブだよ!';
ELSE
RAISE NOTICE '学生はアクティブじゃない。';
END IF;
END;
$$;
BOOLEANを使うときのポイント:
- 論理値は
IFやWHILEの条件でそのまま使える。 NULLは「未定義」として扱われるから、判定のときは注意しよう。
RECORD型の使い方
RECORDは、事前に構造が決まっていないデータ行を保存できる強力な型。SQLクエリの結果が複数カラムあるときに特に便利!
例:テーブルの全レコードをループする
次の例では、studentsテーブルの全レコードをループして、各学生の名前とIDを表示するよ。
DO $$
DECLARE
student RECORD; -- データ行を保存する動的型
BEGIN
FOR student IN SELECT id, name FROM students LOOP
RAISE NOTICE 'ID: %, 名前: %', student.id, student.name; -- レコードのカラムにアクセス
END LOOP;
END;
$$;
RECORDを使うときのポイント:
RECORD型の変数は、ループの中やSELECT INTOでしか値が入らないよ。- カラムには
record.column_nameでアクセスできる。
テーブル操作用のROWTYPE型
テーブルの1行全体を(しかも型安全に)保存したいときは、ROWTYPE型を使うと便利。テーブルの行構造を自動で引き継いでくれるよ。
例:ROWTYPE型の使い方
DO $$
DECLARE
student students%ROWTYPE; -- studentsテーブルの行構造を持つ変数
BEGIN
SELECT * INTO student FROM students WHERE id = 1; -- 行データを変数にロード
RAISE NOTICE '学生の名前: %, コース: %', student.name, student.course;
END;
$$;
RECORDとROWTYPEの違い
| 特徴 | RECORD | ROWTYPE |
|---|---|---|
| カラム構造 | 事前に決まっていない | テーブルやクエリに依存 |
| 使い方 | どんな結果にも柔軟に対応 | 構造が固定されている |
実践例
アクティブな学生の数と名前を返す関数を書いてみよう。
CREATE FUNCTION active_students_report() RETURNS TABLE(id INT, name TEXT) AS $$
BEGIN
RETURN QUERY
SELECT id, name FROM students WHERE is_active = TRUE;
END;
$$ LANGUAGE plpgsql;
関数の呼び出し:
SELECT * FROM active_students_report();
データ型操作時のエラー
データを扱っていると、たまにエラーが出ることもある。よくあるパターンを紹介するね:
- 型エラー:
INTEGER変数に文字列を入れようとする(例:my_var := 'abc';)。 TRUEやFALSEが期待される場所でNULLを使う。- 初期化せずに
RECORDを使おうとする。
エラーを防ぐコツ:
- 変数の型は必ず明示しよう。
- テーブルのカラム型を事前にチェックしよう。
RAISE NOTICEみたいなデバッグ用コマンドを活用しよう。
これでPL/pgSQLのINTEGER、TEXT、BOOLEAN、RECORD型の使い方はバッチリ!この知識があれば、もっと複雑でパワフルなPostgreSQLのプロシージャルプログラミングができるようになるよ。
GO TO FULL VERSION