エンタープライズ:特集 2003/08/24 11:32:00 更新

[JAVA Developer特別企画]2003年10月号
知っておきたいデータベース移行術「Oracle→DB2編」 (2/7)

JAVA Developer 2003年10月号より転載

■(1)データベース・オブジェクト
 データベースオブジェクトは、表1のように対応させます。基本的にそのまま対応できるものから、対応できないものまでさまざまです。
 またOracleでは、オブジェクト名に30バイトまで許されていますが、DB2ではオブジェクトタイプによって最大長が異なります(表2)。索引やトリガーなどはOracleよりも最大長が短いため、名前を変更して対応する必要があります。

表1 データベース・オブジェクト対応表

Oracle DB2 備考
DB2には、格納プロパティを指定するストレージ句に相当するものがない
パーティション表 DB2V8のMDCで対応
クラスタ表 × 対応機能なし
索引 索引 ファンクション索引、逆キー索引、ドメイン索引は除く
索引構成表 DB2はINCLUDE列付き索引で対応
索引パーティション × 対応機能なし
ネスト表(NestedTable) × 対応機能なし
順序 順序 DB2ではPREVVALとNEXTVAL
シノニム エイリアス(ALIAS) DB2のエイリアスは表とビューのみ
ビュー ビュー(視点) ほぼ同等
マテリアライズドビュー(Mview) マテリアライズド照会表(MQT)  
UNDOセグメントorロールバックセグメント × 対応機能なし
トリガー トリガー DB2は、AFTERトリガーとBEFORE行トリガーとINSTEAD OFトリガー
ストアドプロシージャ ストアドプロシージャ  
ストアドファンクション ユーザー定義関数(UDF) DB2のUDFは、INSERT/UPDATE/DELETE文を発行できない
パッケージ × 対応機能なし

・(1)表
 表をCREATE TABLE文で作る点はOracleと同じです。ただし、DB2には格納プロパティを指定するストレージ句に相当するものはありません。すべてDBMSにお任せとなります。
 またDB2では、索引の格納先である表スペースは、CREATE TABLE文中でしか指定できません。DB2の表スペースには、OSが管理するSMS(System Managed Space)表スペースと、領域をDBMSが管理するDMS(Database Managed Space)表スペースの2種類があります。Oracleの表スペースは、DB2のDMS表スペースと同じだといえます。表と索引で表スペースを分けたい場合には、DMS表スペースを使用しなくてはいけません。

・(2)パーティション表
 Oracleでは、大規模な表をパーティションという単位に分割し、効率化を図る機能を提供しています。ここではパーティション表の中でもレンジパーティション(論理パーティション)について説明します。
 レンジパーティションとは、ある列値の範囲ごとに、表データをパーティションに分ける機能です。大きな表を小さな複数のパーティションに分割することで、検索を速めたり、管理を容易にしたりといったメリットがあります。
 従来のDB2には、このような論理パーティション機能はなかったのですが、DB2 V8においてMDC(Multi Dimensional Clustering)という機能が追加され、論理パーティション機能を実現しました(図1)。
図1
図1 DB2 V8で追加されたMDC(Multi Dimensional Clustering)機能

 このMDCでは、データを属性ごとに別々のエクステントに分けて格納します。また各エクステント(MDCにおいてはブロックと呼ばれます)をポイントする索引が自動的に作成され、ある属性のデータのみ検索する場合には、対象のブロックのみがスキャンされます。

・(3)索引
 Oracleと同じくCREATE INDEX文により作成します。 (1)で説明したように、DB2では格納先表スペースの指定をCREATE TABLE文で行うため、ここでは指定できません。

・(4)索引構成表
 Oracleの索引構成表は、キー値に基づいて行データが索引に格納されるというものです。これにより、キー検索でのアクセスがほとんどである表の場合には索引スキャンのみで処理を終えられるので、パフォーマンスが向上します。
 それに対するものとして、DB2にはINCLUDE列付き索引というのがあります。これは、通常の索引にキー値だけでなく別の列値も含められるというものです。Oracleの索引構成表と違い、索引だけでなく表のスペースも別途必要となりますが、列値を選択できる柔軟性があります。

・(5)順序
 Oracleと同じくCREATE SEQUENCE文で作成します。OracleがCURRVALとNEXTVALであるのに対し、DB2ではPREVVALとNEXTVALという属性を使用し、値の取り出し形式も若干違います。
 OracleのCURRVALは、直近に生成された順序の値を返します。NEXTVALとCURRVALが、1つのSQL文中で参照されたときにはこれら2つは同じ値が返ります。これに対しDB2のPREVVALは、前回NEXTVALが参照されて成功したときの値を返すようになっています。したがって1つのSQL文中にNEXTVALとPREVVALがある場合は同じ値が返りません。
 置き換えは単純です。SQL文中にCURRVALだけがある場合は、CURRVALはPREVVALに書き換えます。SQL文中にCURRVALとNEXTVALがある場合には、CURRVALをNEXTVALに書き換えます。NEXTVALは、いずれの場合もそのままNEXTVALとします。


Oracle
SELECT 部門順序番号.NEXTVAL,
部門順序番号.CURRVAL
FROM DEPT;

DB2
SELECT NEXTVAL FOR 部門順序番号,
NEXTVAL FOR 部門順序番号.PREVVAL
FROM DEPT;

・(6)シノニム
 Oracleのシノニムは、DB2ではエイリアス(別名)で代用します。なお、DB2にはPUBLICキーワードはありません。


Oracle
CREATE SYNONYM emp2 FOR emp;

DB2
CREATE ALIAS emp2 FOR emp;

・(7)ビュー(視点)
 日本アイ・ビー・エムの日本語訳では、VIEWは「視点」と訳されています。構文はほぼ同じです。


CREATE VIEW empsalary
   AS SELECT empno,empname,salary
   FROM payroll,personnel
       WHERE empno=empnumb
       AND salary>30000.00

・(8)トリガー
 DB2のトリガーは、INSERTING、UPDATING、DELETINGをサポートしておりません。それらの句を使用して処理内容を分岐させている場合には、INSERT、UPDATE、DELETEごとに別々のトリガーを作成する必要があります。またトリガーを変更したい場合は適宜削除・再作成する必要があります。リスト1、2は、OracleとDB2でのBEFORE行トリガーの例です。

リスト1 BEFORE行トリガーの例(Oracle)

CREATE OR REPLACE TRIGGER 給料変更
 BEFORE UPDATE OF 給料 ON 従業員
 FOR EACH ROW
 WHEN (new.職業='セールス')
 BEGIN
   :new.コミッション := :old.コミッション*(:new.給料/:old.給料);
 END;
 /

リスト2 BEFORE行トリガーの例(DB2)

CREATE TRIGGER 給料変更_U NO CASCADE
 BEFORE UPDATE OF 給料 ON 従業員
 REFERENCING OLD AS OLD NEW AS NEW
 FOR EACH ROW
 MODE DB2SQL
 BEGIN ATOMIC
   SET NEW.コミッション=OLD.コミッション*(CAST (NEW.給料 AS FLOAT)/OLD.給料);
 END@

[JAVA Developer特別企画]
知っておきたいデータベース移行術「Oracle→DB2編」
・データベースオブジェクト
・データ型
・ビルトイン関数
・SQL文
・ロックと読み取り一貫性

関連リンク
▼JAVA Developer
▼定期購読のご案内
▼バックナンバー販売協力店

JAVA Developer10月号表紙 JAVA Developer 10月号

大特集
再入門 J2SE

特集2 Oracle9i Application Server
[特別企画]
・例外処理のメカニズム
・データベース移行術(2)
 「Oracle→DB2編」
・Tomcatで試すJava2セキュリティ

前のページ | 1 2 3 4 5 6 7 | 次のページ

[竹内 笑子,JAVA Developer]