スケーラブルデータベースサーバ HiRDB Version 8 解説(Windows(R)用)

[目次][用語][索引][前へ][次へ]

5.2.9 抽象データ型を含む表データの操作

抽象データ型を含む表データの操作方法について説明します。

<この項の構成>
(1) プラグインから提供される抽象データ型の場合
(2) HiRDB XML Extensionから提供される抽象データ型の場合
(3) ユーザが定義した抽象データ型の場合

(1) プラグインから提供される抽象データ型の場合

プラグインを使用する場合には,プラグインから提供される関数を指定してUAPを作成すると,文書,画像,音声などのマルチメディアデータを操作できます。

ここでは,全文検索プラグイン(HiRDB Text Search Plug-in)を使用した場合の例を説明します。

(a) データの検索

ここでは,論理述語を使用したデータの検索の例を説明します。

(例)
薬品管理表の列「取扱説明書」から「効能」という構造部分に,頭痛というキーワードがある,薬品IDを検索するSELECT文の例を次に示します。なお,SQL中には,プラグインから提供される全文構造検索条件に一致する文書を抽出するための関数containsを使用しています。
 
SELECT 薬品ID FROM 薬品管理表
  WHERE contains(取扱説明書,'添付文書データ[効能{"頭痛"}]') IS TRUE
(b) データの更新

ここでは,データの更新の例を説明します。

(例)
薬品管理表の列「薬品ID」が薬品2の「取扱説明書」のデータをUPDATE文で更新する例を次に示します。なお,SQL中には,プラグインから提供される関数SGMLTEXTを使用しています。
 
UPDATE 薬品管理表 SET 取扱説明書 = SGMLTEXT(:sgml)
  WHERE 薬品ID = '薬品2'
 
なお,UPDATE文の前に,あらかじめ次に示すBLOB型の埋込み変数「sgml」を定義しているものとします。
 
EXEC SQL BEGIN DECLARE SECTION;                                 1
  SQL TYPE IS BLOB(300K)sgml;                                   1
EXEC SQL END DECLARE SECTION;                                   1
strcpy(sgml.sgml_data,char_ptr_pointing_to_a_sgml_text);        2
sgml.sgml_length = strlen(char_ptr_pointing_to_a_sgml_text);    3
〔説明〕
  1. BLOB型の埋込み変数「sgml」を定義します。
  2. 埋込み変数「sgml」に,更新する新しいデータを格納します。
  3. 作成したBLOBデータの属性値sgml_lengthを,格納したデータの長さにセットします。
(c) データの削除

ここでは,データ型の削除の例を説明します。

(例)
薬品管理表の列「薬品ID」が薬品2の行をDELETE文で削除する例を次に示します。
 
DELETE FROM 薬品管理表
  WHERE 薬品ID = '薬品2'
(d) データの挿入

ここでは,データの挿入の例を説明します。

(例)
薬品管理表に,列「薬品ID」が薬品25の行をINSERT文で挿入する例を次に示します。なお,SQL中には,プラグインから提供される関数SGMLTEXTを使用しています。
 
INSERT INTO 薬品管理表(薬品ID,取扱説明書)
  VALUES('薬品25',SGMLTEXT(:sgml))
 
なお,INSERT文の前に,あらかじめ次に示すBLOB型の埋込み変数「sgml」を定義しているものとします。
 
EXEC SQL BEGIN DECLARE SECTION;                                 1
  SQL TYPE IS BLOB(300K)sgml;                                   1
EXEC SQL END DECLARE SECTION;                                   1
strcpy(sgml.sgml_data,char_ptr_pointing_to_a_sgml_text);        2
sgml.sgml_length = strlen(char_ptr_pointing_to_a_sgml_text);    3
〔説明〕
  1. BLOB型の埋込み変数「sgml」を定義します。
  2. 埋込み変数「sgml」に,更新する新しいデータを格納します。
  3. 作成したBLOBデータの属性値sgml_lengthを,格納したデータの長さにセットします。

(2) HiRDB XML Extensionから提供される抽象データ型の場合

HiRDB XML Extensionから提供される関数を指定してUAPを作成すると,XML形式のデータを操作できます。

(a) 検索

ここでは,XML形式のデータの検索例について説明します。

(例1)
書籍管理表から,書籍IDが「126513592」である書籍情報をVARCHAR型の値として取り出します。SQL文は,次のように記述できます。
SELECT 書籍ID, XMLSERIALIZE(書籍情報 AS VARCHAR(32000))
    FROM 書籍管理表
    WHERE 書籍ID = 126513592

(例2)
書籍管理表から,カテゴリが「データベース」の書籍のタイトルを取り出します。XQuery式による評価結果を取り出すため,XMLQUERY関数を使用します。また,XQuery式の評価結果が空のシーケンスである行を出力しないように,XMLEXISTS述語を使用します。SQL文は,次のように記述できます。
  SELECT 書籍ID,
         XMLSERIALIZE(
           XMLQUERY('/書籍情報/タイトル'
                     PASSING BY VALUE 書籍情報
                     RETURNING SEQUENCE EMPTY ON EMPTY)
           AS VARCHAR(32000))
    FROM 書籍管理表
    WHERE XMLEXISTS('/書籍情報[カテゴリ="データベース"]'
                     PASSING BY VALUE 書籍情報)

(例3)
書籍管理表から,カテゴリが「データベース」の書籍のタイトルを結合して取り出します。各行のXML型の値を一つのXML型の値として出力するため,XMLAGG集合関数を使用します。SQL文は,次のように記述できます。
SELECT XMLSERIALIZE(
         XMLAGG(
           XMLQUERY('/書籍情報/タイトル'
                      PASSING BY VALUE書籍情報
                      RETURNING SEQUENCE EMPTY ON EMPTY)
         )
         AS VARCHAR(32000))
       FROM 書籍管理表
       WHERE XMLEXISTS('/書籍情報[カテゴリ="データベース"]'
                       PASSING BY VALUE 書籍情報)

(例4)
書籍管理表から,タイトルが「SQL徹底解説」の書籍情報と,カテゴリが同じ書籍のタイトルを取り出します。各行のXML型の値を一つのXML型の値にして,その値に対してXQuery式を評価するため,XMLQUERY関数のXML問合せ引数にXMLAGG集合関数を指定します。SQL文は,次のように記述できます。
SELECT
  XMLSERIALIZE(
    XMLQUERY(
      '$BOOKS/書籍情報[カテゴリ=$BOOKS/書籍情報[タイトル="SQL徹底解説"]/カテゴリ]'
      PASSING BY VALUE XMLAGG(書籍情報) AS BOOKS
      RETURNING SEQUENCE EMPTY ON EMPTY)
    AS VARCHAR(32000))
  FROM 書籍管理表

(3) ユーザが定義した抽象データ型の場合

ユーザが定義した抽象データ型を含む表のデータ操作をする場合には,ルーチン又はコンポネント指定を使用します。コンポネント指定は,抽象データ型を構成する列の属性を操作する場合に使用します。ここでは,ユーザが定義した抽象データ型を含む表のデータ操作の例を説明します。

(a) 抽象データ型の列の検索

ユーザが定義した抽象データ型を含む表の列を検索する例を説明します。

(例)
社員表から,ユーザ定義関数「勤続年数」を使用して,勤続年数が20年以上の社員の社員番号をSELECT文で検索するための例を次に示します。
 
SELECT 社員番号
  FROM 社員表
  WHERE 勤続年数(従業員)>=20
(b) 抽象データ型の列の更新

ユーザが定義した抽象データ型を含む表の列を更新する例を説明します。

(例)
社員表の列「社員番号」が900123の社員の属性「役職」を主任に更新するUPDATE文の例を次に示します。従業員表の列「従業員NO」が900123の,列「従業員」の属性「役職」をコンポネント指定「従業員..役職」を使用して,「主任」に更新するUPDATE文の例を次に示します。
 
UPDATE 社員表
SET 従業員..役職 ='主任'
WHERE 社員番号 = '900123'
(c) 抽象データ型の列の削除

ユーザが定義した抽象データ型を含む表の列を削除する例を説明します。

(例)
従業員表の列「従業員」の属性「役職」が「一般」のデータをコンポネント指定「従業員..役職」を使用して,削除するDELETE文の例を次に示します。
 
DELETE FROM 従業員表
  WHERE 従業員..役職='一般'
(d) データの挿入

ユーザが定義した抽象データ型を含む表にデータを挿入する例を説明します。

(例)
社員表にコンストラクタ関数「t_従業員」を使用して,列「社員番号」が990070の行を挿入するINSERT文の例を次に示します。なお,:x顔写真はBLOB型の埋込み変数で,顔写真の画像が設定されているものとします。
 
INSERT INTO 従業員表
  VALUES ('990070',t_従業員('タシロケイコ',
                           'F',
                           '一般',
                           '1999-04-01',
                           :x顔写真 AS BLOB,
                           140000
                           ))