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 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
定期購読のご案内
バックナンバー販売協力店
|
JAVA Developer 10月号
大特集
再入門 J2SE
特集2 Oracle9i Application Server
[特別企画]
・例外処理のメカニズム
・データベース移行術(2) 「Oracle→DB2編」
・Tomcatで試すJava2セキュリティ
|
|