CodeGym /コース /SQL SELF /PL/pgSQLにおけるデータ型とその使い方: INTEGER, TEXT, BOOLEAN, RECORD

PL/pgSQLにおけるデータ型とその使い方: INTEGER, TEXT, BOOLEAN, RECORD

SQL SELF
レベル 49 , レッスン 4
使用可能

このレクチャーでは、PL/pgSQLでサポートされているデータ型について見ていくよ。特に次の4つのデータ型にフォーカスするね:

  • INTEGER ― 数値を扱うときに使う。
  • TEXT ― 文字列を扱うときに使う。
  • BOOLEAN ― 論理値を扱うときに使う。
  • RECORD ― 動的なデータ構造を扱うときに使う。

それぞれのデータ型を実際の例で見ていくから、使い方がイメージしやすいはず!

PL/pgSQLでサポートされているデータ型

PL/pgSQLは、PostgreSQLでおなじみのデータ型を全部サポートしてるよ。シンプルな数値型(INTEGERNUMERIC)から、配列やJSONBみたいな複雑なものまで。主なものをざっと見てみよう。

  1. プリミティブ型:

    • INTEGERBIGINTFLOATNUMERIC ― 数値型。
    • TEXTCHARVARCHAR ― 文字列型。
    • BOOLEAN ― 論理型。
  2. 複雑な型:

    • 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に小数を入れようとするとエラーになるから注意。そういうときはNUMERICFLOATを使おう。

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は論理値(TRUEFALSENULL)を保存する型。条件判定やデータのフィルタリングで超便利!

例:学生のアクティブ状態をチェック

例えば、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を使うときのポイント:

  • 論理値はIFWHILEの条件でそのまま使える。
  • 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;
$$;

RECORDROWTYPEの違い

特徴 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';)。
  • TRUEFALSEが期待される場所でNULLを使う。
  • 初期化せずにRECORDを使おうとする。

エラーを防ぐコツ:

  • 変数の型は必ず明示しよう。
  • テーブルのカラム型を事前にチェックしよう。
  • RAISE NOTICEみたいなデバッグ用コマンドを活用しよう。

これでPL/pgSQLのINTEGERTEXTBOOLEANRECORD型の使い方はバッチリ!この知識があれば、もっと複雑でパワフルなPostgreSQLのプロシージャルプログラミングができるようになるよ。

1
アンケート/クイズ
PL/pgSQLへのイントロ、レベル 49、レッスン 4
使用不可
PL/pgSQLへのイントロ
PL/pgSQLへのイントロ
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION