抽象データ型とルーチンを使用して,複雑な構造を持つデータ型とその操作を独自に定義し,利用できます。
任意の構造を持つデータ型(抽象データ型)を定義するには,定義系SQLのCREATE TYPEを実行します。CREATE TYPEでは,データ構造とそのデータに対する操作を定義します。ここでは,次に示すデータ構造を持つ抽象データ型「t_従業員」を定義し,それに対する操作を関数として定義します。
CREATE TYPE t_従業員 ( …1
PUBLIC 氏名 NCHAR(16),
性別 CHAR(1),
役職 NCHAR(10),
PRIVATE 入社年月日 date, …2
PUBLIC 顔写真 BLOB(64K),
PROTECTED 基本給 INTEGER, …3
PUBLIC FUNCTION t_従業員(p_氏名 NCHAR(16), …4
p_性別 CHAR(1),
p_役職 NCHAR(10),
p_入社年月日 date,
p_顔写真 BLOB(64K),
p_基本給 INTEGER)
RETURNS t_従業員
BEGIN
DECLARE d_従業員 t_従業員; …5
SET d_従業員=t_従業員(); …6
SET d_従業員..氏名=p_氏名; …7
SET d_従業員..性別=p_性別; …7
SET d_従業員..役職=p_役職; …7
SET d_従業員..入社年月日=p_入社年月日; …7
SET d_従業員..顔写真=p_顔写真; …7
SET d_従業員..基本給=p_基本給; …7
RETURN d_従業員; …8
END,
PUBLIC FUNCTION 勤続年数(p t_従業員) RETURNS INTEGER …9
BEGIN
DECLARE working_years INTERVAL YEAR TO DAY;
SET working_years=CURRENT_DATE - p..入社年月日;
RETURN YEAR(working_years);
END,
PROTECTED FUNCTION 報酬率(p t_従業員) RETURNS FLOAT …10
BEGIN
DECLARE rate FLOAT;
SET rate=勤続年数(p)*0.2/30;
RETURN rate;
END,
PUBLIC FUNCTION 報酬(p t_従業員) RETURNS INTEGER …11
BEGIN
DECLARE bonus INTEGER;
SET bonus=p..基本給*報酬率(p);
RETURN bonus;
END
)
抽象データ型「t_従業員」をスーパタイプとするサブタイプ「t_営業部員」の定義例を次に示します。
CREATE TYPE t_営業部員 UNDER t_従業員
( PUBLIC 担当顧客 NCHAR(15),
PUBLIC FUNCTION 報酬(p t_営業部員) RETURNS INTEGER
BEGIN
DECLARE salebonus INTEGER;
SET salebonus = 顧客総数(・・・)*1000+p..基本給*報酬率(p);
RETURN salebonus;
END
)
操作系SQLのINSERT文で値が明示的に指定されない場合,抽象データ型全体の値はナル値になります。
表定義で,ある抽象データ型を直接指定していない場合でも,その抽象データ型の上位の抽象データ型(スーパタイプ)が列の型に指定されている場合,代替可能性によってその抽象データ型(サブタイプ)の値は表に格納されている場合があります。このため,抽象データ型(サブタイプ)を削除する場合には注意が必要です。
次の図に示す代替可能性を利用した抽象データ型を含む表の場合にサブタイプを削除する方法について説明します。
図7-3 代替可能性を利用した抽象データ型を含む表の例
抽象データ型のサブタイプを削除できないケースについては,「(5)注意」を参照してください。