1.4.5 繰り返し列

ここでは,DABroker for C++から繰り返し列へアクセスするための基礎知識として,SQL文を使った,繰り返し列のデータ操作について説明します。

繰り返し列は,図1-4に示すように,複数の要素(データ)を一つのフィールド値として持てるフィールドのことです。図の例では,資格及び趣味のフィールドを繰り返し列としています。1レコード目の資格フィールド(繰り返し列)には三つの要素があるといい,要素を特定するために,配置されている順に要素番号が1から付けられます。また,情報処理第1種,映画鑑賞,旅行などの各データを要素の値といいます。例えば,1レコード目の資格フィールドで,要素番号1の要素の値は「情報処理第1種」となります。

図1-4 繰り返し列を使ったテーブル

[図データ]

次に,上記の社員表テーブルを作成する場合の,テーブル定義及び複数列インデックス定義のSQL文の例を示します。

CREATE TABLE 社員表
      (氏名ID CHAR(4) NOT NULL,           --NULL値不可
       性別   SMALLINT(1) NOT NULL,       --NULL値不可
       資格   NCHAR(15)  ARRAY[3],
                            --フィールド値として持てる最大要素数3
       趣味   NCHAR(15)  ARRAY[4]);
                            --フィールド値として持てる最大要素数4
CREATE INDEX 資格趣味 ON 社員表(資格,趣味);

以下に,繰り返し列のあるテーブルへのデータアクセスについて説明します。

<この項の構成>
(1) レコードの検索
(2) レコードの追加
(3) レコードの更新
(4) レコードの削除

(1) レコードの検索

繰り返し列の各要素の値を検索の条件として利用できます。SQL文は以下のように指定します。

// 資格の「ネットワーク」,趣味の「旅行」の,両方の条件を満たす氏名IDを検索
SELECT 氏名ID FROM 社員表
       WHERE ARRAY(資格,趣味) [ANY] ( 資格 =N'ネットワーク'
                                                    AND 趣味 =N'旅行' );

検索の条件に繰り返し列の要素の値を使う場合は,そのフィールドに対して複数列インデクスが定義されている必要があります。

(2) レコードの追加

繰り返し列を持つレコードを追加する際には,その要素の指定順序を考慮する必要があります。ARRAYで指定した順に要素は配置されます。

// 社員IDがZ004のレコードを追加
INSERT INTO 社員表
       VALUES ('Z004',
                1,
                ARRAY[N'英語検定',N'ネットワーク']
                ARRAY[N'パソコン',N'旅行',N'音楽鑑賞',N'ギター']);

(3) レコードの更新

繰り返し列を更新する場合はSQLのUPDATE文を使いますが,繰り返し列の更新は,次の三つの場合に分けられます。

(a) 要素の追加(ADD句)

フィールド値に要素を追加します。[*]を指定することによって,要素は最後に追加されます。

(例)

// Z002レコードの資格フィールドの最後の要素位置に,「データベース」を追加
UPDATE 社員表
       ADD 資格[*]  =ARRAY [N'データベース']
       WHERE 氏名ID =Z002;

(b) 要素の更新(SET句)

既存の要素を更新します。更新する要素の位置は,繰り返し列内の要素番号を使って指定します。

(例)

// z001の趣味を「映画鑑賞」から「インターネット」へ変更
UPDATE 社員表
       SET 趣味[1]  =ARRAY [N'インターネット']
       WHERE 氏名ID =Z001;

(c) 要素の削除(DELETE句)

要素を削除する場合は,削除する要素の要素番号を指定します。要素を削除した場合は,その要素以下の要素番号は繰り上がります。したがって,要素番号1の要素を削除した場合,要素番号2の要素が1になります。

(例)

// Z002の趣味「音楽鑑賞」を削除
UPDATE 社員表
       DELETE 趣味[1]
       WHERE 氏名ID =Z002;

(4) レコードの削除

レコードを削除する場合,繰り返し列を持たない場合と同様にSQLのDELETE文を指定します。

(例)

// 資格の「ネットワーク」,趣味の「旅行」の,両方の条件を満たすレコードを削除
DELETE FROM 社員表
       WHERE ARRAY(資格,趣味) [ANY] ( 資格 =N'ネットワーク'
                                                    AND 趣味 =N'旅行' );