6. PL/SQL レコード

 


📝 PL/SQLの「レコード」をマスターしよう!

データベースのテーブルには、たくさんの列(カラム)があります。例えば、顧客テーブルには、名前、住所、電話番号、メールアドレスなど、多くの情報が1つの行にまとまっています。

これをPL/SQLで扱うとき、それぞれの列ごとに変数を用意するのは大変です。

そんなときに便利なのが「レコード(Record)」です。


1. レコードって一体何? 📦

レコードは、複数の情報をひとまとめにできる「複合データ型」です。

例えるなら、テーブルの1行分(すべての列)の情報を入れることができる、特別な「箱」のようなものです。

変数(スカラー型)レコード(複合型)
1つの情報しか入れられない複数の情報をひとまとめにして入れられる
VARCHAR2, NUMBER, DATEなどテーブルの行、または自分で定義した型のまとまり

なぜレコードを使うべきか? 🤔

  • コードがシンプルに: 10個、20個と多くの変数を宣言する代わりに、1つのレコード変数だけで済みます。

  • メンテナンスが楽に: データベースのテーブルに新しい列が追加されても、コードをほとんど修正する必要がありません。

  • 管理がしやすい: データを一塊として扱えるため、プロシージャ間でデータをやり取りするのも簡単になります。


2. レコードの主な使い方 ✍️

① データベースのデータを読み込む

SELECT INTO文を使って、テーブルの1行分のデータをレコード変数にまるごと入れられます。

【構文】SELECT * INTO 変数名 FROM テーブル名 WHERE 条件;

%ROWTYPE属性】 レコード変数を宣言するときは、%ROWTYPEという属性を使うと便利です。これにより、指定したテーブルのすべての列のデータ型と長さを自動で引き継いでくれます

例:

SQL
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テーブルのすべての列の情報が入ります。


② レコードの値の操作

レコードに入った値は、レコード変数名.列名という形でアクセスできます。

【値の変更】

SQL
c_rec.first_name := 'ソヌ';

【レコード間の値のコピー】 1つのレコードのすべての値を、別のレコードに一括でコピーできます。

SQL
c_rec2 := c_rec1;

③ データを挿入・更新する

レコードを使えば、データを挿入したり更新したりするのも非常にシンプルになります。

【データの挿入】INSERT文のVALUES句で、レコード変数を指定するだけで、すべての列に値を挿入できます。

SQL
INSERT INTO CUSTOMER VALUES c_rec;

これにより、c_recに含まれるすべての値がCUSTOMERテーブルに挿入されます。

【データの更新】UPDATE文のSET句で、ROWというキーワードを使うと、レコード変数で値を更新できます。

SQL
UPDATE CUSTOMER SET ROW = c_rec WHERE customer_id = 16;

これにより、customer_id16の行が、c_recのすべての値で更新されます。


3. ユーザー定義レコード 🎨

%ROWTYPEはテーブルの全列を対象としますが、もし特定の列だけをまとめたレコードを作りたい場合は、自分でレコードの型を定義できます。

【構文】

SQL
TYPE 型名 IS RECORD (
  列名1 データ型,
  列名2 データ型,
  ...
);

【例:姓と名だけのレコードを作成】

SQL
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のレコードを使いこなすことで、コードが驚くほどシンプルで読みやすくなります。

前の記事:5. PL/SQL パッケージ

次の記事:7. PL/SQL カーソル