8. PL/SQL コレクション

 


📝 PL/SQLコレクション入門:データのリストを賢く扱おう

PL/SQLには、複数のデータをまとめて管理するための「コレクション」という便利な仕組みがあります。これは、他のプログラミング言語でいうところの「配列」のようなものです。

コレクションを使えば、バラバラのデータを一つの箱にまとめて、効率的に処理できるようになります。


1. コレクションの基本概念 📦

コレクションは「一次元配列」であり、以下の特徴を持っています。

  • 要素(Element): コレクションに格納される個々のデータ。

  • インデックス(Index): 各要素に割り当てられた位置番号。

  • 同じデータ型: コレクション内のすべての要素は、同じデータ型(VARCHAR2NUMBERRECORDなど)でなければなりません。

疎と密:コレクションの状態

  • 密なコレクション (Dense):すべてのインデックスにデータが入っていて、隙間がない状態。

  • 疎なコレクション (Sparse):インデックスの間にデータが入っていない隙間がある状態。


2. 3種類のコレクションを使い分けよう! 🗂️

PL/SQLには、用途に応じて3つのコレクションタイプがあります。

① 連想配列 (Associative Array)

【特徴】

  • インデックス: BINARY_INTEGER(数値)またはVARCHAR2(文字列)でインデックスを付けられます。

  • 初期化不要: 使う前に初期化する必要はありません。

  • データベースに保存不可: データベースの列に直接格納することはできません。

  • 隙間OK: 疎なコレクションを作成できます。

【使い分けのポイント】 最も一般的でよく使われるタイプです。特に、文字列をインデックスとして使いたい場合に便利です。

② ネストされたテーブル (Nested Table)

【特徴】

  • インデックス: 整数値のみでインデックスを付けられます。

  • 初期化必須: 使う前にコンストラクタで初期化が必要です。

  • データベースに保存可能: データベースの列に格納できます。

  • 隙間OK: 疎なコレクションを作成できますが、通常は密になります。

【使い分けのポイント】 データベースにコレクションを保存したい場合に適しています。また、後述するMULTISET演算子を使いたい場合に便利です。

③ VARRAY (Variable-size Array)

【特徴】

  • サイズ固定: DECLARE上限の要素数を必ず指定します。

  • 初期化必須: 使う前に初期化が必要です。

  • データベースに保存可能: データベースの列に格納できます。

  • 隙間なし: 密なコレクションであり、一度作った要素は削除できません。

【使い分けのポイント】 要素数があらかじめ決まっている場合にのみ使います。非常に特殊なケースでしか使われないため、ほとんどの場合、連想配列やネストされたテーブルを使います。


3. コレクションを操作する便利メソッド 🔨

コレクションには、データを操作するための便利なメソッド(関数)が多数用意されています。

メソッド名動作
EXISTS(n)インデックスnに要素が存在すればTRUEを返す。
COUNTコレクション内の要素の数を返す。
FIRST, LAST最初の要素、最後の要素のインデックスを返す。
NEXT(n), PRIOR(n)インデックスnの次の、または前のインデックスを返す。
EXTEND(n)コレクションの末尾にn個の要素を追加する。
TRIM(n)コレクションの末尾からn個の要素を削除する。
DELETE(n)インデックスnの要素を削除する。

EXTENDTRIMは主にネストされたテーブルとVARRAYで使われます。DELETEは連想配列とネストされたテーブルで使えますが、VARRAYでは使えません。


4. MULTISET演算子:ネストされたテーブルの特権! 🤝

ネストされたテーブルは、MULTISET演算子を使って、集合演算(複数のセットを結合したり、共通部分を見つけたりする)ができます。これはSQLのUNIONINTERSECTと同じような働きをします。

演算子動作SQLでの類義語
MULTISET UNION2つのコレクションのすべての要素を結合する。UNION ALL
MULTISET UNION DISTINCT2つのコレクションの重複しない要素を結合する。UNION
MULTISET EXCEPT1番目のコレクションにだけ存在する要素を返す。MINUS
MULTISET INTERSECT両方のコレクションに共通する要素を返す。INTERSECT

このように、コレクションを使いこなすことで、PL/SQLでのデータ処理が格段に効率的になります。特に、大量データを扱う際には必須のテクニックです。

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

次の記事:9. PL/SQL トリガー