📝 PL/SQLの「レコード」をマスターしよう!
データベースのテーブルには、たくさんの列(カラム)があります。例えば、顧客テーブルには、名前、住所、電話番号、メールアドレスなど、多くの情報が1つの行にまとまっています。
これをPL/SQLで扱うとき、それぞれの列ごとに変数を用意するのは大変です。
そんなときに便利なのが「レコード(Record)」です。
1. レコードって一体何? 📦
レコードは、複数の情報をひとまとめにできる「複合データ型」です。
例えるなら、テーブルの1行分(すべての列)の情報を入れることができる、特別な「箱」のようなものです。
なぜレコードを使うべきか? 🤔
コードがシンプルに: 10個、20個と多くの変数を宣言する代わりに、1つのレコード変数だけで済みます。
メンテナンスが楽に: データベースのテーブルに新しい列が追加されても、コードをほとんど修正する必要がありません。
管理がしやすい: データを一塊として扱えるため、プロシージャ間でデータをやり取りするのも簡単になります。
2. レコードの主な使い方 ✍️
① データベースのデータを読み込む
SELECT INTO文を使って、テーブルの1行分のデータをレコード変数にまるごと入れられます。
【構文】SELECT * INTO 変数名 FROM テーブル名 WHERE 条件;
【%ROWTYPE属性】
レコード変数を宣言するときは、%ROWTYPEという属性を使うと便利です。これにより、指定したテーブルのすべての列のデータ型と長さを自動で引き継いでくれます。
例:
DECLARE
-- customerテーブルの行全体を保持するレコード変数を宣言
c_rec CUSTOMER%ROWTYPE;
v_customer_id NUMBER := 10;
BEGIN
-- CUSTOMERテーブルからcustomer_id=10の行を取得し、c_recに格納
SELECT * INTO c_rec
FROM customer
WHERE customer_id = v_customer_id;
-- レコード内の特定の値にアクセス
DBMS_OUTPUT.PUT_LINE('名前: ' || c_rec.first_name);
DBMS_OUTPUT.PUT_LINE('国: ' || c_rec.country);
END;
/
これで、c_recという1つの変数に、customerテーブルのすべての列の情報が入ります。
② レコードの値の操作
レコードに入った値は、レコード変数名.列名という形でアクセスできます。
【値の変更】
c_rec.first_name := 'ソヌ';
【レコード間の値のコピー】 1つのレコードのすべての値を、別のレコードに一括でコピーできます。
c_rec2 := c_rec1;
③ データを挿入・更新する
レコードを使えば、データを挿入したり更新したりするのも非常にシンプルになります。
【データの挿入】INSERT文のVALUES句で、レコード変数を指定するだけで、すべての列に値を挿入できます。
INSERT INTO CUSTOMER VALUES c_rec;
これにより、c_recに含まれるすべての値がCUSTOMERテーブルに挿入されます。
【データの更新】UPDATE文のSET句で、ROWというキーワードを使うと、レコード変数で値を更新できます。
UPDATE CUSTOMER SET ROW = c_rec WHERE customer_id = 16;
これにより、customer_idが16の行が、c_recのすべての値で更新されます。
3. ユーザー定義レコード 🎨
%ROWTYPEはテーブルの全列を対象としますが、もし特定の列だけをまとめたレコードを作りたい場合は、自分でレコードの型を定義できます。
【構文】
TYPE 型名 IS RECORD (
列名1 データ型,
列名2 データ型,
...
);
【例:姓と名だけのレコードを作成】
DECLARE
-- 姓と名だけを保持するレコード型を定義
TYPE customer_rec IS RECORD (
first_name VARCHAR2(50),
last_name VARCHAR2(50)
);
-- 定義した型を使って変数を宣言
c_rec customer_rec;
BEGIN
-- c_recに値を代入
c_rec.first_name := 'ソヌ';
c_rec.last_name := 'アフォンソ';
DBMS_OUTPUT.PUT_LINE('名前: ' || c_rec.first_name || ' ' || c_rec.last_name);
END;
/
これにより、テーブルには存在しない、プログラム独自のレコード型を作成できます。
このように、PL/SQLのレコードを使いこなすことで、コードが驚くほどシンプルで読みやすくなります。
