(例)
2. カーソルを開く
5.2.9 抽象データ型を含む表データの操作
抽象データ型を含む表データの操作方法について説明します。
(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'
5. SQL によるデータベースアクセス
なお,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 を,格納したデータの長さにセットします。
5. SQL によるデータベースアクセス
(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 書籍情報)
5. SQL によるデータベースアクセス
(例 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) 抽象データ型の列の削除
ユーザが定義した抽象データ型を含む表の列を削除する例を説明します。
5. SQL によるデータベースアクセス
(例)
従業員表の列「従業員」の属性「役職」が「一般」のデータをコンポネント指定「従業員..役職」を使 用して,削除する DELETE 文の例を次に示します。
DELETE FROM 従業員表
WHERE 従業員..役職='一般'
(d) データの挿入
ユーザが定義した抽象データ型を含む表にデータを挿入する例を説明します。
(例)
社員表にコンストラクタ関数「t_従業員」を使用して,列「社員番号」が
990070
の行を挿入する INSERT 文の例を次に示します。なお,:x 顔写真は BLOB 型の埋込み変数で,顔写真の画像が設定さ れているものとします。INSERT INTO 従業員表
VALUES ('990070',t_従業員('タシロケイコ', 'F',
'一般', '1999-04-01', :x顔写真 AS BLOB, 140000
))
5. SQL によるデータベースアクセス