コレクション(配列)の種類は3種類あるようです。
- 結合配列(PL/SQL表、索引付表 ともいう)
- ネストした表(PL/SQL表 ともいう)
- 可変配列(VARRAYともいう)
結合配列以外のネストした表、可変配列は、なにをするためのものなのか、なんのためにあるのか、
今の私には難しすぎて理解できないです。
いつか理解できたときに、残りのふたつの記事を書くことにして、今回は結合配列について書いていきます。
結合配列(PL/SQL表、索引付表 ともいう)
まずは結合配列を使ってみます。結合配列とはHashやMapといった連想配列みたいなものです。
Shift the Oracle PL/SQL コレクション型に結合配列の特徴がまとまってます。
結合配列の特徴の一部
- データベースに格納できない
- 初期化していなくてもNULLではない
- 実行開始時には既にNULLではなくNULLにできない。(エラーになる)
- PL/SQL ブロック内だけで有効 (CREATE TYPE できない)
結合配列の使い方
1. まずは配列の「データ型」を宣言します。
TYPE 配列データ型名 IS TABLE OF 格納する値の型 INDEX BY キーのデータ型
たとえば
キーが数値で値が50バイトの文字列の場合のコレクションのデータ型の宣言
TYPE ary_type IS TABLE OF VARCHAR2(50) INDEX BY BINARY_INTEGER;
キーが10バイトの文字列で値が50バイトの文字列の場合のコレクションのデータ型の宣言
TYPE ary_type IS TABLE OF VARCHAR2(50) INDEX BY VARCHAR2(10);
2. 変数を宣言 『型』を作っただけでは使用できないので、作った型をデータ型とした変数を宣言します。
3. 変数を使い終わったらnullを代入してメモリ解放できないので、Deleteメソッドを使用してメモリを解放します。
配列データ型名.DELETE;
下記のコードはMemberテーブルより全データを取得し、
配列のキーにMemberId列の値、配列の値にMemberName列の値を設定して配列を作成します。
DECLARE --配列の型を宣言 TYPE aryName_type IS TABLE OF VARCHAR2(10) INDEX BY VARCHAR2(4); --配列変数を宣言 aryName aryName_type; --カーソルを宣言 CURSOR member_cur IS SELECT MemberId, MemberName FROM Member; --カーソルデータを格納するレコード変数 member_rec member_cur%Rowtype; BEGIN OPEN member_cur; LOOP FETCH member_cur INTO member_rec; EXIT WHEN member_cur%NOTFOUND; --MemberIdをキーにMemberNameを配列に格納 aryName(member_rec.MemberId) := member_rec.MemberName; END LOOP; CLOSE member_cur; --配列よりMemberId='2'のMemberNameを出力する SYS.DBMS_OUTPUT.PUT_LINE( aryName('2') ); --使い終わったらDELETEメソッドでメモリ解放する aryName.DELETE; END;配列の値にレコードを設定することもできます。
以下のコードは、配列のキーにレコードのインデックス番号、配列の値にレコードを設定して配列を作成します。
DECLARE --カーソル宣言 CURSOR member_crs IS SELECT MemberId, MemberName FROM Member; --カーソルデータを代入するレコード変数 member_rec member_crs%Rowtype; --キーにインデックス番号、値にレコードを持つ配列型を宣言 TYPE ary_type IS TABLE OF member_crs%Rowtype INDEX BY Binary_Integer; --配列型の変数 ary ary_type; --カウンタ変数 counter NUMBER(4); BEGIN OPEN member_crs; counter := 0; LOOP FETCH member_crs INTO member_rec; EXIT WHEN member_crs%NOTFOUND; --インデックス番号をキーにレコードを配列に格納 ary(counter) := member_rec; counter := counter + 1; END LOOP; CLOSE member_crs; --配列のインデックスの2番目の要素を取り出す member_rec := ary(2); SYS.DBMS_OUTPUT.PUT_LINE(member_rec.MemberId || ' ' || member_rec.MemberName); --使い終わったらDELETEメソッドでメモリ解放する ary.DELETE; END;配列の値に配列を設定するこで多次元配列にできます。
以下のコードは、二次元配列で九九表のサンプルです。
DECLARE TYPE col_type IS TABLE OF NUMBER(2) INDEX BY BINARY_INTEGER; TYPE row_type IS TABLE OF col_type INDEX BY BINARY_INTEGER; --配列型の変数 kukuTable row_type; BEGIN FOR row in 1 .. 9 LOOP FOR col in 1..9 LOOP kukuTable(row)(col) := row * col; END LOOP; END LOOP; SYS.DBMS_OUTPUT.PUT_LINE( '7 × 9 = '|| kukuTable(7)(9) ); END;
0 件のコメント:
コメントを投稿