この章では、MySQLデータベースとOracle Databaseを比較します。主な内容は次のとおりです。
この項では、IBM DB2で使用されるデータ記憶域および方法の概要や、これらの方法および概念とOracleで使用される方法および概念との類似点または相違点について説明します。
Oracle Databaseは、1つ以上の表領域で構成されています。表領域では論理記憶域が提供され、データを保持する物理ディスクとデータベースがリンク付けされます。表領域は、1つ以上のデータファイルから作成されます。データファイルは、ファイル・システム内のファイルまたはデバイスで指定されるディスク領域の領域です。データファイルを追加することで表領域を大きくすることができます。
基本的なOracle Databaseは、Oracleデータ・ディクショナリ表が格納されているSYSTEM表領域で構成されています。また、ユーザー定義の表領域によっても構成されています。表領域は、データベース・オブジェクトの論理的な格納場所です。たとえば、表領域のどこに特定の表または索引を作成するかを指定できます。表領域のサイズは、表領域に割り当てられたディスク領域の量によって決定されます。各表領域は、1つ以上のデータファイルからなります。
データベース・スキーマには、表、索引およびその他のデータベース固有のオブジェクトの定義が含まれています。
この項では、次の項目に関する情報を提供します。
OracleとIBM DB2のスキーマ・オブジェクトには多くの類似点があります。ただし、これらのデータベース間で異なるスキーマ・オブジェクトもあります。Oracleのスキーマ・オブジェクトの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。Oracleへの直接マッピングが存在しないIBM DB2のスキーマ型の詳細は、「設計上の考慮事項」を参照してください。
表 2-1に、2つのデータベースのスキーマ・オブジェクトの類似点および相違点をリストし、SQL Developerがこれらのスキーマ・オブジェクトの移行をサポートするかどうかを示します。
表2-1 OracleとIBM DB2のスキーマ・オブジェクト
IBM DB2 | Oracle | ステータス |
---|---|---|
チェック制約 |
チェック制約 |
移行される脚注1 |
列のデフォルト |
列のデフォルト |
移行される脚注2 |
データベース |
データベース |
移行される |
データ・リンク |
バイナリ・ファイル |
移行されない |
外部キー |
外部キー |
移行される |
関数 |
ファンクション |
移行されない |
グループ |
ロール |
移行される |
ID列 |
自動増加列 |
移行される |
索引 |
索引 |
移行される |
主キー |
主キー |
移行される |
スキーマ |
ユーザー |
移行される脚注3 |
シーケンス |
順序 |
移行されない |
ストアド・プロシージャ |
ストアド・プロシージャ |
移行されない |
構造化データ型 |
抽象データ型 |
移行されない |
同義語表 |
別名 |
移行される |
表 |
表 |
移行される |
表の別名 |
パブリック・シノニム |
移行される |
表スペース |
表領域 |
移行される |
構造化データ型を含む表 |
抽象データ型を含む表 |
移行されない |
一時表 |
一時表 |
移行されない |
型付き表 |
オブジェクト表 |
移行されない |
型付きビュー |
オブジェクト・ビュー |
移行されない |
UDBパッケージ |
PL/SQLパッケージ |
移行されない |
UDB SQL関数 |
PL/SQLファンクション |
移行されない |
UDB SQLプロシージャー |
PL/SQLプロシージャ |
移行されない |
UDBトリガー |
PL/SQLトリガー |
移行されない |
ユニーク・キー |
一意キー |
移行される |
ユーザー |
ユーザー |
移行される脚注4 |
ビュー |
ビュー |
移行されない |
構造化データ型を含むビュー |
抽象データ型を含むビュー |
移行されない |
脚注1 このスキーマ・オブジェクトは移行されますが、SQL Developerによって解析はされません
脚注2 このスキーマ・オブジェクトは移行されますが、SQL Developerによって解析はされません
脚注3 IBM DB2のスキーマ・マッピングの詳細は、第4章「オフライン・データ・ロード」を参照してください
脚注4 SQL Developerは、USR_GUESTのように接頭辞USR_を付けてユーザーをマップします
予約語はOracleとIBM DB2とでは異なります。Oracleの予約語の一部は、IBM DB2では有効なオブジェクト名または列名です。スキーマ・オブジェクト名に予約語を使用すると、同じ名前を複数のデータベースにわたって使用できなくなります。SQL Developerは、Oracleの予約語であるIBM DB2オブジェクトの名前の末尾にアンダースコアおよび数字(_n)を追加します。
オブジェクト名は、OracleでもIBM DB2でも大/小文字が区別されません。Oracleの予約語のリストは、『Oracle Database SQL言語リファレンス』を参照してください。
この項では、IBM DB2データベースをOracleに変換する際に考慮する必要がある表設計の問題について説明します。次のトピックに関する情報が含まれます。
複数のデータベースを作成して、OracleとIBM DB2の関連データのセグメントをグループ化できます。SQL Developerを使用して一度に多くのIBM DB2データベースを移行する場合、すべてのIBM DB2データベースは指定された1つのOracle Databaseに移行されます。
参照整合性制約は、複数の表の列間の関係を制御する規則です。整合性制約は、Oracle DatabaseとIBM DB2データベースとで非常に似ています。この項では相違点について説明します。
IBM DB2の参照整合性制約では、ON DELETE句およびON UPDATE句がサポートされます。Oracleの参照整合性制約では、ON DELETE句のみがサポートされます。
表2-2は、OracleとIBM DB2間の削除整合性制約のマッピングの概要、およびSQL Developerがこれらの句の移行をサポートするかどうかを示します。
IBM DB2では、各表はその表のプライマリ・データを含む表領域に割り当てられます。ただし、オプションで、表の索引が2番目の表領域に、表のラージ・オブジェクトが3番目の表領域に格納される場合があります。同じ表領域に1つ以上の表を割り当てることができます。各表領域はコンテナのコレクションで構成されており、各コンテナはファイル・システム、物理ファイルまたはハード・ディスクなどのデバイスのいずれかに存在するディレクトリです。
IBM DB2はsystem managed space(SMS)およびdatabase managed space(DMS)を提供します。SMS表領域は、オペレーティング・システムによって提供される機能を使用して物理領域を管理します。IBM DB2はDMS表領域の物理領域を直接管理します。
Oracleはディクショナリ管理表領域の方法およびローカル管理表領域の方法を使用して空き領域と使用済領域を追跡します。ディクショナリ管理表領域はデータ・ディクショナリによって管理されるエクステントであり、一方、ローカル管理表領域は表領域によって管理されるエクステントです。次の理由から、ローカル管理表領域をお薦めします。
エクステントの論理管理では、再帰的な領域管理操作を回避できます。これは、ディクショナリ管理表領域では、エクステント領域の消費または解放によって、ロールバック・セグメントまたはデータ・ディクショナリ表の領域を消費または解放する別の操作が発生する場合に発生する可能性があります。
エクステントのローカル管理によって隣接した空き領域が自動的に追跡されるため、空きエクステントを結合する必要がなくなります。
SQL DeveloperはDMS表領域およびSMS表領域をOracleのローカル管理表領域に自動的にマップします。SQL Developerを使用して、表領域ごとにこれをディクショナリ管理表領域にリセットできます。
IBM DB2の別名は表の別名またはビューの代替名です。表の別名は作成または削除できます。別名の使用には認可は不要です。ただし、別名によって参照される表およびビューへのアクセスには、適切な認可が必要です。別名の長さは30文字までです。
SQL Developerは表の別名をパブリック・シノニムに移行します。SQL DeveloperによってOracleに作成されるすべてのユーザー・アカウントには、CREATE PUBLIC SYNONYMおよびDROP PUBLIC SYNONYMシステム・レベル権限が付与されます。これらの権限の詳細は、第4章「オフライン・データ・ロード」を参照してください。
IBM DB2のID列は、連続した、リカバリ可能な一意の値を表の各行に自動的に生成する方法を提供します。ID列は、各表に1つのみ割り当て可能です。ID列として定義される列は、SMALLINT、INTEGER、BIGINTまたはDECIMALのような正確な算術データ型である必要があります(スケールとして0を使用できます)。ID列には次の特性があります。
表の作成時に表の一部として定義されます。表を作成した後は、表を変更してID列を追加することはできません。
自動的に1つの表に対する値を生成します。
GENERATED ALWAYSコマンドを使用して定義した場合、使用する値が常にデータベース・マネージャーによって生成されます。
Oracleは常にID列をAUTO INCREMENT列にマップします。Oracleは、順序およびトリガーを使用してID列をエミュレートします。これを詳細に説明するために、OracleのMyTableという表にAuto_Valという名前のAUTO INCREMENT列を作成するとします。まず、次の例のように順序を作成する必要があります。
CREATE SEQUENCE MySequence START WITH 1 INCREMENT BY 1 NO MAX VALUE;
この例では、START WITH値は1で、この値は表に対するINSERT操作のたびに1ずつ増加します。NO MAX VALUEは、この値が増加し、特定の時点でリセットされることがないことを指定します。次に、この順序によって作成される値をAuto_Val列に挿入するトリガーが必要になります。これは次のように作成します。
CREATE TRIGGER MyTrigger BEFORE INSERT ON MyTable FOR EACH ROW Begin SELECT MySequence.NEXTVAL INTO :MyTable.Auto_Val FROM DUAL; END;
SQL Developerは、ID列に対してこのソリューションを自動的に生成します。ID列のGENERATED_ALWAYS属性は、常に、AUTO_INCREMENT移行ソリューションに従います。したがって、すべてのID列は、GENERATED_ALWAYS属性が設定されていたものとして生成されます。SQL Developerは、GENERATED_ALWAYS属性を指定しないID列が、この属性付きで移行されることを警告します。
この項では、IBM DB2データベースおよびOracle Databaseで使用されるデータ型の相違点について説明します。この項には次の情報が含まれています。
表2-3に、IBM DB2で利用できるデータ型およびそれに対応するOracleのデータ型を示します。
すべてのIBM DB2データ型は、NULL値をサポートします。NULL値は、存在しない値、不明な値または適用できない値として定義されます。すべてのデータ型にNULL値が含まれますが、NOT NULLと定義された列にNULL値を含めることはできません。
表2-3 OracleおよびIBM DB2におけるデータ型
IBM DB2のデータ型 | 説明 | Oracleデータ型 |
---|---|---|
BLOB |
最大2GB(2,147,483,647)長の可変長バイナリ・ラージ・オブジェクト文字列。主に、音声、混合メディアなど、従来とは異なるデータの保持に使用します。BLOB文字列は、FOR BIT DATA文字列と同様に、キャラクタ・セットとは関連付けられていません。 |
|
CHAR FOR BIT DATA(length) |
1から124までの長さの固定長文字列。lengthが省略された場合のデフォルトは1です。 バイナリ・データとして処理されます。 |
|
CHAR VARYING FOR BIT DATA(length) |
最大32,672バイト長の可変長文字列。 バイナリ・データとして処理されます。 |
|
CHAR VARYING(length) |
最大32,672バイト長の可変長文字列。 |
|
1から124までの長さの固定長文字列。lengthが省略された場合のデフォルトは1です。 |
||
CHARACTER FOR BIT DATA(length) |
1から124までの長さの固定長文字列。lengthが省略された場合のデフォルトは1です。 バイナリ・データとして処理されます。 |
|
CHARACTER VARYING FOR BIT DATA(length) |
最大32,672バイト長の可変長文字列。 バイナリ・データとして処理されます。 |
|
CHARACTER VARYING(length) |
最大32,672バイト長の可変長文字列。 |
|
CHARACTER(length) |
1から124までの長さの固定長文字列。lengthが省略された場合のデフォルトは1です。 |
|
CLOB |
最大2GB(2,147,483,647)長の可変長キャラクタ・ラージ・オブジェクト文字列です。CLOBには、シングルバイト文字列またはマルチバイトの文字ベースのデータを格納できます。CLOBは文字列とみなされます。 |
CLOB |
DBCLOB |
最大1,073,741,823のダブルバイト文字を格納できる可変長文字列。DBCS CCSIDが関連付けられています。DBCLOBは図形文字列とみなされます。 |
CLOB |
GRAPHIC(length) |
1から127までの長さの固定長文字列。lengthが省略された場合のデフォルトは1です。 |
|
LONG VARCHAR(length) |
最大32,700バイト長の可変長文字列 |
|
LONG VARGRAPHIC(length) |
最大16,350文字のダブルバイト文字の可変長図形文字列。 |
|
VARCHAR FOR BIT DATA(length) |
最大32,672バイト長の可変長文字列。 バイナリ・データとして処理されます。 |
|
VARCHAR(length) |
最大32,672バイト長の可変長文字列。 |
|
VARGRAPHIC(length) |
最大16,336文字のダブルバイト文字の可変長図形文字列 |
文字データ型にはいくつか種類があります。IBM DB2の各文字データ型は、さらに表2-4に示すいずれかの型に分類できます。混合文字データ型の長さは、ダブルバイト文字1つにつき2バイト、シングルバイト文字1つにつき1バイトとカウントしたバイトの合計数です。
文字列はバイト列です。文字列の長さは、列におけるバイトの数です。文字列の長さが0の場合は、これは空の文字列と呼ばれます。これは、NULL値とは異なります。
表2-4 文字列のカテゴリ
可変長文字列の列のすべての値は同じ最大長です。列のlength属性によってこれが決定されます。length属性は1から32,740の範囲である必要があります。表2-5に各文字列の定義を示します。
表2-5 文字列の定義
文字列 | 定義 |
---|---|
CHARまたはCHARACTER |
単一文字。 |
CHAR FOR BIT DATAまたはCHARACTER FOR BIT DATA |
単一文字。バイナリ・データとして処理されます。 |
CHAR(length)またはCHARACTER(length) |
長さが1から254の範囲の固定長文字列。 |
CHAR(length) FOR BIT DATAまたはCHARACTER(length) FOR BIT DATA |
これは固定長の文字列です。長さが1から254の範囲のバイナリ・データとして処理されます。 |
VARCHAR(length)またはCHARACTER VARYING(length)またはCHAR VARYING(length) |
これは、長さが1から32,672の範囲の可変長文字列です。 |
VARCHAR(length) FOR BIT DATAまたはCHARACTER VARYING(length) FOR BIT DATAまたはCHAR VARYING(length) FOR BIT DATA |
これは可変長の文字列です。長さが1から32,672の範囲のバイナリ・データとして処理されます。 |
ラージ・オブジェクト・データ型には、サイズが0バイトから2GBの範囲のデータが格納されます。3つのラージ・オブジェクト・データ型があります。
コード・ページが関連付けられている、シングルバイト文字で構成された文字列。このデータ型にはテキスト中心の情報が含まれ、情報量が通常のVARCHARデータ型の制限より大きくなることがあります。SQL Developerでは、情報のコード・ページ変換およびその他の文字種との互換性がサポートされます。
コード・ページが関連付けられている、ダブルバイト文字で構成された文字列。このデータ型には、ダブルバイト・キャラクタ・セットが使用されたテキスト中心の情報が含まれます。このデータ型の最大長は1,073,741,823です。
コード・ページが関連付けられていない、バイトで構成されたバイナリ文字列。
図形文字列はダブルバイト文字の文字列です。文字列長は列内の文字数です。単一文字の文字列と同様に、図形文字列は空にできます。固定長図形文字列の列のすべての値は同じ長さで、この長さは列のlength属性によって決定されます。
列のlength属性によって、値の最大長が決定されます。前述の表2-6には、各図形データ型についての説明があります。各図形データ型は、さらにDBCSデータまたはUCS-2データに分類できます。
このデータ型では、2バイトですべての文字が表されます。すべてのDBCS図形には、コード化されたダブルバイト・キャラクタ・セットを識別するコード化文字セットID(CCSID)が関連付けられています。
すべての数値には符号および精度があります。精度とは、符号を除いた2進数または10進数の合計数です。値が0以上の場合は、符号は正です。表2-7では、IBM DB2で利用可能な数値型およびそれに対応するOracleの数値型について説明します。
表2-7 OracleおよびIBM DB2における数値型
DB2 UDBデータ型 | 説明 | Oracleデータ型 |
---|---|---|
BIGINT |
19桁の精度を持つ8バイトの大きな2進整数。このデータ型の範囲は-9,223,372,036,854,775,808から+9,223,372,036,854,775,807です。 |
|
DECIMAL(precision, scale) |
パック10進数。precisionは桁数であり、1から31の範囲です。scaleは小数点の右側の桁数であり、0からprecisionに指定された値までの範囲です。 DECIMAL(precision, 0)としてDECIMAL(precision)を使用できます。また、DECIMAL(5, 0)としてDECIMALを単独で使用できます。小数点の位置はその数値の精度およびスケール(その数値の小数部の桁数)によって決定されます。DECIMAL列のすべての値は、同じ精度およびスケールを持ちます。 10進数の変数またはDECIMAL列の数値の範囲は-nから+nであり、nの絶対値は、適用される精度およびスケールで表される最大の数字です。最大範囲は、-1031 + 1から1031 - 1です。 |
|
DOUBLE |
FLOATと同義です。 |
|
FLOAT(precision) |
浮動小数点数。precisionは桁数で、1から53の範囲です。 precision値が1から24までの場合、単精度浮動小数点数を示します。 precision値が25から53までの場合、倍精度浮動小数点数を示します。 precision値を指定しない場合は、倍精度浮動小数点数になります。 単精度浮動小数点数は、1.17549436 x 10-38から3.40282356 x 10+38の範囲の実数の32ビットの近似値です。 倍精度浮動小数点数は、2.2250738585072014 x 10-308から1.7976931348623158 x 10308の範囲の実数の64ビットの近似値です。 |
|
INTEGER |
4バイトの2進整数。10桁の精度を持ちます。このデータ型の範囲は–2,147,483,648から+2,147,483,647です。 |
|
NUMERIC(precision, scale) |
ゾーン10進数。precisionは桁数であり、1から31の範囲です。scaleは小数点の右側の桁数であり、0からprecisionに指定された値までの範囲です。 DECIMAL(precision, 0)としてDECIMAL(precision)を使用できます。また、DECIMAL(5, 0)としてDECIMALを単独で使用できます。 |
NUMBER |
REAL |
単精度浮動小数点。数値は0にできるほか、範囲は-3.402E+38から-1.175E-37または1.175E-37から3.402E+38です。 |
|
SMALLINT |
5桁の精度を持つ2バイトの2進整数。このデータ型の範囲は-32,768から+32,767です。 |
表2-8に、利用可能なIBM DB2のベース日時型およびそれらのOracleへのマップ方法を示します。
表2-8 OracleおよびIBM DB2における日時データ型
IBM DB2のデータ型 | 説明 | Oracleデータ型 |
---|---|---|
DATE |
この型は、年、月および日で構成されています。これはカレンダの日付を表します。年の範囲は0001から9999、月の範囲は1から12、日の範囲は1からnです(nは月および年の値に応じて28、29、30または31になります)。 DATE列の長さは10バイトで、これはこの値の文字列表現に適した長さです。 |
DATE |
TIME |
この型は、時、分および秒で構成されています。これは24時間表記の時刻値を表します。 時の範囲は0から24、分の範囲は0から59、秒の範囲は0から59です。 時が24に設定された場合は、分および秒は0に設定する必要があります。時刻の内部表現は3バイトの文字列です。 各バイトは、2つのパック10進数です。1つ目のバイトは時を、2つ目のバイトは分を、最後のバイトは秒を表します。 TIME列の長さは8バイトで、これはこの値の文字表現に適した長さです。 |
DATE |
TIMESTAMP |
この型は、年、月、日、時、分、秒およびマイクロ秒で構成されています。これはカレンダの日付および24時間表記の時刻値を表します。 年、月および日の範囲は、DATEデータ型と同じです。時、分および秒の範囲は、TIMEデータ型と同じです。ミリ秒の範囲は0から999です。 TIMESTAMPの内部表現は10バイトの文字列であり、各バイトは2つのパック10進数からなります。先頭の4バイトは日付を表し、次の3バイトは時間を表し、末尾の3バイトはマイクロ秒を表します。 TIMESTAMP列の長さは26バイトで、これはこの値の文字列表現に適した長さです。 |
TIMESTAMP |
DATE型、TIME型およびTIMESTAMP型の値は内部形式で表されます。ただし、これらのデータ型は文字列によっても表されます。日時データ型には定数も変数もありません。日時値を取得するには、文字列変数に日時値を割り当てる必要があります。長さにかかわらず、LOB文字列もLONG VARCHAR文字列も、日時値を表す文字列としては使用できません。
表2-9に、IBM DB2のDATE値の有効な文字列表現を示します。
表2-9 IBM DB2のDATE値の有効な文字列表現
形式名 | 形式 | 例 |
---|---|---|
国際標準化機構(ISO) |
yyyy-mm-dd |
2002-05-30 |
IBM USA標準(USA) |
mm/dd/yyyy |
05/30/2002 |
IBM欧州標準(EUR) |
dd.mm.yyyy |
30.05.2002 |
日本工業規格の西暦(JIS) |
yyyy-mm-dd |
2002-05-30 |
定義されたサイト(LOC) |
データベースの国コードに依存 |
適用なし |
DATEの文字列表現は数字で始まり、8文字以上の長さです。末尾に空白が含まれる場合があるほか、月および日のセクションからは先頭の0を省略できます。
表2-10に、IBM DB2のTIME値の有効な文字列表現を示します。
表2-10 IBM DB2のTIME値の有効な文字列表現
形式名 | 形式 | 例 |
---|---|---|
国際標準化機構(ISO) |
hh.mm.ss |
17.30.01 |
IBM USA標準(USA) |
hh:mm AMまたはPM |
5:30 PM |
IBM欧州標準(EUR) |
hh.mm.ss |
17.30.01 |
日本工業規格の西暦(JIS) |
hh:mm:ss |
17:30:01 |
定義されたサイト(LOC) |
データベースの国コードに依存 |
TIMEの文字列表現は数字で始まり、4文字以上の長さです。末尾に空白を含めることができるほか、先頭の0は省略されることがあります。秒を省略すると、暗黙的に0秒を指定したとみなされます。
TIMESTAMPの文字列表現は数字で始まり、16文字以上の長さです。また、形式はyyyy-mm-dd-hh.mm.ss.nnnnnnです。末尾に空白を含めることができるほか、月から先頭の0を省略できます。日、時およびマイクロ秒は、切り捨てられるか、すべて省略されることがあります。マイクロ秒の末尾の0を省略すると、不足している桁には暗黙的に0が指定されたとみなされます。
USA標準時刻文字列形式の分の指定は省略できます。分が省略されると、暗黙的に00分が指定されたとみなされるため、5p.mは5:00 PMとなります。さらに、時は1から12(00:00 AMの場合として12を含む)の範囲である必要があります。AMまたはPMの前には空白が1つあります。
注意: ISOは、JIS標準と同一になるように時刻形式を変更しました。アプリケーションに最新のISO形式が必要な場合は、JIS標準を使用する必要があります。ISO、EURおよびJIS標準の.ssまたは:ss部分はオプションです。 |
IBM DB2では、DATE、TIMEおよびTIMESTAMP文字列に含めるのは、シングルバイト文字および数値のみにする必要があります。
SQL DeveloperはIBM DB2のデータ・リンクの移行はサポートしません。IBM DB2のデータ・リンクを移行する必要がある場合は、Oracleのバイナリ・ファイル(BFILE)を作成することをお薦めします。Oracleのバイナリ・ファイルの詳細は、『Oracle9i SQLリファレンス』を参照してください。
IBM DB2は、組込みデータ型に基づいて新しいデータ型を定義する機能を提供します。これらのデータ型はユーザー定義の固有データ型と呼ばれます。
SQL Developerでは、ユーザー定義の固有データ型の移行はサポートされません。表内のユーザー定義の固有型(IBM DB2で定義される)を使用する列は、Oracleモデルのベース型を使用して定義されます。
構造化データ型とは、ユーザー定義のデータ型で、その構造がデータベースで定義されています。このデータ型は指定された一連の属性からなり、各属性はデータ型を持ちます。構造化データ型は、スーパータイプと呼ばれる別の構造型のサブタイプとして定義される場合もあります。サブタイプにはスーパータイプのすべての属性が継承されるほか、追加の属性を定義できます。
構造型は、表またはビューのデータ型として使用できます。構造型の名前およびデータ型は、表(型付き表)の列の名前およびデータ型になります。型付き表の行は、構造型のインスタンスを表します。
構造化データ型のインスタンスは、列の値としてデータベースに格納することもできます。表の列にオブジェクトを格納するには、構造化データ型を使用して列を定義します。
IBM DB2の構造化データ型のOracleへの論理マッピングは、抽象データ型です。SQL Developerは、構造化データ型の移行をサポートしません。