ServerデータベースとOracleデータベースとの比較について説明します。内容は次のとおりです。スキーマの移行データ型データ記憶域の概要データ操作言語スキーマの移行スキーマには、表、ビュー、索引、ユーザー、制約、ストアド・プロシージャ、トリガーおよびデータベース固有のその他のオブジェクトの定義が含まれています。ほとんどのリレーショナル・データベースは、類似したオブジェクトとともに動作します。この項では、次の項目について説明します。Serverのスキーマ・オブジェクトには、多くの類似点があります。一部のスキーマ・オブジェクトでは、これらのデータベース間で異なるものがあります。次の表を参照してください。Serverでは異なります。Serverでの有効なオブジェクトまたは列の名前です。Serverの予約語ではありません。Serverでは列名にDATEを使用できます。スキーマ・オブジェクト名に予約語を使用すると、同じ名前を複数のデータベースにわたって使用できなくなります。大文字/小文字の区別以外に、1つ以上の特性が他のスキーマ・オブジェクトとは異なるスキーマ・オブジェクト名を選択し、そのオブジェクト名がいずれのデータベースでも予約語ではないことを確認する必要があります。SQLリファレンス』を参照してください。ServerデータベースをOracleに変換する際に考慮が必要な、表の設計上の多くの問題について説明します。次の項目について説明します。キー制約チェック制約データ型ここでは、次のデータ型の変換時における考慮事項について説明します。Serverの日時の精度は、1/300秒です。その精度は、1/100000000秒です。OracleにはDATEデータ型もあり、秒単位で正確な日時の値が格納されます。Workbenchには、DATEデータ型に対するデフォルトのマッピングがあります。ServerのDATEデータ型のデータ型マッピングにTIMESTAMPデータ型を選択する必要があります。データベースでは、DATEおよびTIMEデータ型に対し時間の値が格納されます。Serverアプリケーションが時間の値のかわりに、DATETIME列を使用して一意のIDを提供している場合は、DATETIME列をOracleスキーマ定義のSEQUENCEに置き換えます。次の例では、元の設計のDATETIMEの精度をOracle表で秒単位より高い精度にすることはできません。この例では、DATETIME列は一意のIDを提供するために使用すると想定しています。ミリ秒単位の精度を必要としない場合は、次の例に示す表の設計で十分です。null)次の設計では、順序の値をinteger_columnに挿入できます。これによって、OracleのDATEデータ型フィールドで許容される1秒単位の精度を超えて、表の行を順序付けできます。Serverの表に含めると、Oracleデータベースに対して同じ表設計を保持できます。Serverデータベースの場合、integer_columnの値は、常にNULLです。Oracleの場合、integer_columnフィールドの値は、順序の次の値に更新されます。順序を作成するには、次のコマンドを発行します。datetime_seqこの順序に対して生成される値は、1から始まり、1ずつ増加します。一意のIDとしてDATETIMEの値を使用するアプリケーションは多くはありませんが、日時の精度には秒単位より高い精度が必要です。科学アプリケーションのタイムスタンプには、ミリ秒、マイクロ秒およびナノ秒単位での表現が必要となる場合があります。ServerのDATETIMEデータ型の精度は1/300秒であり、OracleのDATEデータ型の精度は1秒です。OracleのTIMESTAMPデータ型の精度は、1/100000000秒です。記録される精度は、オペレーティング・システムによって異なります。Serverとでは異なります。Serverでは、IMAGEまたはTEXTデータへのポインタは行とともに表に格納されますが、IMAGEまたはTEXTデータは個別に格納されます。この処理によって、1つの表にIMAGEまたはTEXTデータの複数の列が許可されます。Oracleでは、IMAGEデータはBLOB型のフィールドに格納され、TEXTデータはCLOB型のフィールドに格納されます。Oracleでは、1つの表にBLOBおよびCLOBの複数の列を許可します。BLOBおよびCLOBは、そのサイズによっては、行に格納されない場合があります。ServerのTEXT列で、データが4000バイトを超えない場合は、この列をOracleのCLOB列ではなくVARCHAR2データ型列に変換します。Oracle表では、複数のVARCHAR2列を定義できます。TEXTデータのこのサイズは、ほとんどのアプリケーションに適しています。ServerのSQLに対するT-SQL固有のこの拡張機能を使用すると、ユーザー固有のデータ型を定義および名前付けして、システム・データ型を補うことができます。ユーザー定義データ型は、データベースのいずれの列のデータ型として使用できます。デフォルトおよびルール(チェック制約)は、これらのユーザー定義データ型にバインドすることができ、これらのユーザー定義データ型の個々の列に自動的に適用されます。Workbenchは各ユーザー定義データ型に対するベース・データ型を決定し、同等のPL/SQLデータ型を検出します。注意:ユーザー定義データ型を使用すると、異なるデータベース・サーバー間でのデータ定義言語コードおよび手続き型SQLコードの移植性が低くなります。Serverでは、表に対して主キーを定義できます。TABLE文で定義できます。Oracleでは、宣言的な参照整合性が提供されます。TABLE文の一部として定義できます。Serverでは、表に対して外部キーを定義できます。TABLE文で定義できます。Oracleでは、宣言的な参照整合性が提供されます。TABLE文を使用すると、外部キーを表定義に追加できます。データベース概要』を参照してください。Serverでは、表に対して一意キーを定義できます。TABLE文で定義できます。TABLE文の一部として定義します。Oracleでは、これらの制約を施行するために、内部的に一意索引が作成されます。ServerからOracleへ、1対1でマッピングされます。TABLE文で定義できます。1つの表に複数のチェック制約を定義できます。表レベルのチェック制約は、制約付き表のいずれの列も参照できます。1つの列に設定できるのは、1つのチェック制約のみです。列レベルのチェック制約は、制約付き列のみを参照できます。これらのチェック制約は、複雑な正規表現をサポートします。TABLE文の一部として定義します。チェック制約は、列レベルではなく、表レベルで定義されます。したがって、チェック制約は、表のいずれの列も参照できます。Oracleでは、複雑な正規表現をサポートしていません。like"([0-9][0-9][0-9])[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]"このルールでは、(650)506-7000のような電話番号はすべて渡されます。このルールでは、次のような電話番号はすべて渡されません。650-GET-HELPOracleでこの整合性制約を実装するには、次の方法があります。SUBSTR、TRANSLATEおよびLIKE句を組み合せて使用し、チェック制約のphone_ruleの動作をシミュレートする。トリガーを記述し、PL/SQLを使用する。Serverデータベースの表レベルのチェック制約は、Oracleのチェック制約に1対1でマッピングされます。Serverの列レベルのチェック制約は、Oracleの表レベルのチェック制約に実装できます。正規表現の変換では、すべての単純な正規表現はOracleのチェック制約に変換されます。Serverのチェック制約は、単純な正規表現の組合せで構成されるチェック制約として作成し直すか、またはOracleデータベース・トリガーを記述して同じ機能を実現するようにできます。ServerとOracleデータベースで使用するデータ型の違いについて説明します。この項の内容は、次のとおりです。Server説明OracleコメントINTEGER4バイト整数、31ビットおよび符号。短縮形は「INT」です(バージョン5より前でこの短縮形が必須)。NUMBER(10)この型の列に表の制約を設定して(任意)、値を-231から231にすることができます。適切な制約(1から50のSTATE_NOなど)を設定します。SMALLINT2バイト整数、15ビットおよび符号。NUMBER(6)表の制約をこの型の列に設定して(任意)、値を-215から215にすることができます。適切な制約(1から50のSTATE_NOなど)を設定します。TINYINT1バイト整数、8ビットおよび符号なし。0から255の数値を格納します。NUMBER(3)x(0から255)のチェック制約を追加できます。ここで、xは列名です。4バイトで、24ビットの2進精度、7桁精度です。データ範囲は、–3.40E+38から3.40E+38です。Sybaseでは、値の範囲および実際の表現は、プラットフォームによって異なります。このため、データをプラットフォーム間で移動すると、誤った解釈が発生する場合があリます。REALの数値は、4バイトで格納され、6桁の10進数を適切な精度で表現できます。SybaseのREALは、OracleではANSIに対応してマッピングされます。FLOATOracleへのREALのANSIデータ型変換は、FLOAT(63)です。Workbenchによって、REALからFLOAT(24)にマッピングされます。このデータ型には、Oracleでは最大8桁の有効桁数を持つ10進数が格納されます。OracleのNUMBERデータ型は、固定小数点数および浮動小数点数の両方を10進演算に対応する書式で格納するために使用されます。値の範囲を制限するために、チェック制約を追加できます。OracleのNUMBER型はREALより精度および移植性が高いため、このデータ型で演算を行うと、異なる結果になります。Oracleでは、浮動小数点数をFLOAT[(b)]という書式で指定できます。ここで、[(b)]は2進精度bを示し、1から126の範囲で指定できます。[(b)]のデフォルトは126です。特定の2進精度を10進精度に換算するには、[(b)]に0.30103を乗算して、自然数に切り上げます。FLOAT浮動小数点数。この列の精度は15桁です。FLOATOracleへのFLOAT(p)のANSIデータ型変換は、FLOAT(p)です。PRECISIONのANSIデータ型変換は、FLOAT(126)です。Workbenchによって、FLOATからFLOAT(53)にマッピングされます。このデータ型は、Oracleでは最大16桁の有効桁数を持つ10進数が格納されます。OracleのNUMBERデータ型は、固定小数点数および浮動小数点数の両方を10進演算に対応する書式で格納するために使用されます。OracleのNUMBER型はFLOATより精度および移植性が高く、また範囲が異なるため、このデータ型で演算を行うと、異なる結果になります。NUMBERデータ型の範囲は、-9.99.99E+125から9.99.99E+125です(38個の9の後に0(ゼロ)が88個続く)。Workbenchは、Oracleデータベースへのこのデータの挿入に失敗し、エラーが戻されます。これは-1.0E+126以下の負の値の場合も同じです。Oracleでは、浮動小数点数をFLOAT[(b)]で指定できます。ここで、[(b)]は2進精度[(b)]を示し、1から26の範囲で指定できます。[(b)]のデフォルトは126です。特定の2進精度を10進精度に換算するには、[(b)]に0.30103を乗算して、自然数に切り上げます。浮動小数点数が範囲を超えている場合、大きすぎる浮動小数点数では桁あふれ、小さすぎる浮動小数点数では桁落ちが発生します。BIT単一バイトの1ビットとして格納されるブール0または1。単一バイトには、表から最大8ビットの列を格納できます(連続していない場合でも)。ビット・データをNULLにすることはできません。7.0では、BITデータ型にNULLが許可されています。NUMBER(1)Oracleでは、ビットをNUMBER(1)またはCHARに格納します。CHAR(n)常にn個の8ビット文字を持つ固定長文字列(空白が埋め込まれる)。これは、CHARACTERと同義です。Serverの場合、nは1以上256未満です。7.0の場合、nは1以上8000未満です。CHAR(n)Pro*Cクライアント・プログラムでは、文字列を比較するために、mode=ansiに設定し、文字を正確に解析する必要があります。これ以外の場合は、mode=oracleに設定します。2001から4000の範囲のCHARデータ型は無効です。Workbenchによって、この範囲のCHARデータ型は、自動的にVARCHAR2に変換されます。VARCHAR(n)可変長文字列。Serverの場合、nは1以上256未満です。7.0の場合、nは1以上8000未満です。VARCHAR2(n)TEXT2KBページの増分で割り当てられる8ビット・バイトの文字列。「テキスト」は、2024バイト・ページのリンク・リストとして格納されます(空白が埋め込まれる)。TEXT列には、最大231から1を引いた文字数を格納できます。CLOBCLOBフィールドには、最大4GBを格納できます。IMAGE8ビット・バイトのバイナリ文字列。最大231から1を引いたバイト数のバイナリ・データを格納できます。BLOBBLOBフィールドには、最大4GBを格納できます。BINARY(n)常にn個の8ビット・バイトの固定長バイナリ文字列。Serverの場合、nは1以上256未満です。7.0の場合、nは1以上8000未満です。RAW(n)/BLOBVARBINARY(n)最大n個の8ビット・バイトの可変長バイナリ文字列。Serverの場合、nは1以上256未満です。7.0の場合、nは1以上8000未満です。RAW(n)/BLOBDATETIME2つの4バイト整数で格納される日付および時刻。日付部分は、基準日(1900年1月1日)からのオフセット日数の合計として表され、1つ目の整数部分に格納されます。許容値は、西暦1753年1月1日から9999年12月31日までの有効な日です。時刻部分の許容値は、0から25920000の範囲の有効な時間です。精度は、3.33ミリ秒単位(切捨て)です。DATETIME型の列のデフォルト値は、1900年1月1日です。ServerのDATETIMEの精度は異なります。DATETIMEデータ型は、DATEデータ型より高い精度を持ちます。このため、DATETIME列が一意であると仮定すると、様々な影響が発生します。Serverでは、DATETIME型の列に一意の値を格納できます。ServerのDATETIMEの精度が、1/100秒単位であるためです。Oracleでは、これらの値を一意にすることができません。これは、データの精度が秒単位であるためです。一意の組合せを得るために、DATETIME列を2つの列(DATEデータ型と順序)に置換できます。2列目に1秒未満の桁を格納することをお薦めします。OracleのTIMESTAMPデータ型も使用できます。このデータ型の精度は、1/100000000秒です。SMALL-DATETIME2つの2バイト整数で格納される日付および時刻。日付の範囲は、1900年1月1日から2079年6月6日です。時刻は、午前0時からの分数の合計です。DATE任意でチェック制約を使用すると、より高い精度を有効にできます。MONEY整数部分と小数部分で表される通貨の値で、2つの4バイト整数で格納されます。精度は、1/10,000単位です。この型のデータを入力する場合は、データの前にドル記号($)を入力する必要があります。Serverは、浮動小数として値を作成します。通貨データの値の範囲は、-922,337,203,685,477.5808から922,337,203,685,477.5807で、精度は通貨単位の1/10,000です。格納サイズは、8バイトです。Serverでは、数値データ型として先頭にドル記号($)を付けてMONEYデータ型を入力します。$5.00のように入力します。問合せからドル記号($)を削除する必要があります。Oracleは、より汎用的であり、ドル記号($)の使用が想定されていない様々な国の環境で動作します。Oracleでは、NLSを使用して、他の通貨記号およびISO標準をサポートします。NCHAR(n)固定長の文字列データ型。UCS-2キャラクタ・セットが使用されます。nの値は、1から4000の範囲である必要があります。Serverの格納サイズは、nの2倍です。Serverの格納サイズは、nの2倍です。Workbenchでは、バイト・セマンティクスを使用して、列サイズをマッピングします。Workbenchのソース・モデルに表示されます。ServerのNCHAR(1000)列は、ソース・モデルではNCHAR(2000)として表示されます。CHAR(n*2)NVARCHAR(n)固定長の文字列データ型。UCS-2キャラクタ・セットが使用されます。nの値は、1から4000の範囲である必要があります。Serverの格納サイズは、nの2倍です。Serverの格納サイズは、nの2倍です。Workbenchでは、バイト・セマンティクスを使用して、列サイズをマッピングします。Workbenchのソース・モデルに表示されます。ServerのNVARCHAR(1000)列は、ソース・モデルではNVARCHAR(2000)として表示されます。VARCHAR(n*2)SMALLMONEY前述のMONEYと同じです。通貨データの値の範囲は、-214,748.3648から+214,748.3647で、精度は通貨単位の1/10,000です。格納サイズは、4バイトです。NUMBER(10,4)範囲が-214,748.3648から214,748.364であるため、このフィールドは、NUMBER(10,4)で十分です。TIMESTAMPTIMESTAMPは、VARBINARY(8)で定義されNULLが許可されます。TIMESTAMP列を含む行が更新または挿入されるたびに、システムによってTIMESTAMP列が自動的に増加されます。ユーザーがTIMESTAMP列を更新することはできません。NUMBERこの型の列を維持するには、この列にトリガーを配置する必要があります。Oracleでは、同じ種類の複数のトリガーを設定できます。複数のトリガーすべてを1つの大きなトリガーに統合する必要はありません。完全な互換性を得るために、この列の更新を停止するトリガーを設定できます。Serverでは、VARCHAR(30)です。7.0では、NVARCHAR(128)です。ServerのTEXTおよびIMAGEデータ型は、次のルールに従っています。これらのデータ型の列には、索引付けできない。列を主キーにすることはできない。BY、HAVINGおよびDISTINCT句では、列を使用できない。IMAGEおよびTEXTデータ型は、LIKE構文のあるWHERE句で参照できる。IMAGEおよびTEXTデータ型は、SUBSTRおよびLENGTH関数とともに使用できる。Serverでは、可変長データ型の列のみにNULL値を格納できます。NULLを許可する固定長データ型の列を作成した場合、その列は、自動的にシステム可変長データ型に変換されます(表2-3を参照)。これらの可変長データ型は、システム・データ型として予約され、ユーザーがこれらのデータ型を使用して、列を作成することはできません。Workbenchのソース・モデルでは、各列がシステム・データ型である表が表示されます。Serverデータベースではユーザー独自のデータ型を定義できます。これらのユーザー定義データ型は、サーバーによって提供されるベース・データ型に変換されます。これらのベース・データ型では、ユーザーがデータ型を追加して格納することはできませんが、アプリケーション全体の標準データ型の実装に役立ちます。ServerからOracleにデータ型をマッピングできます。Workbenchでは、ユーザー定義データ型がそのベース型に変換されます。Mappings」ページで定義できます。ServerとOracleデータベースのデータ記憶域の概念の違いについて説明します。この項の内容は、次のとおりです。ServerOracleデータベース・デバイス:データベース・デバイスは、指定した物理ディスク・ファイルにマッピングされます。データファイル:1つ以上のデータファイルが各表領域に対して作成され、すべての論理構造のデータが表領域に物理的に格納されます。表領域内での結合されたデータファイルのサイズは、表領域の合計記憶域容量になります。データベース内での結合された表領域の記憶域容量は、データベースの合計記憶域容量になります。データファイルは一度作成すると、サイズを変更できません。この制限は、Oracleにはありません。ページ:複数のページによって、データベース・デバイスが構成されます。各ページには、特定のバイト数が含まれます。データ・ブロック:1つのデータ・ブロックは、ディスクの物理データベース領域の特定のバイト数に相当します。データベースの作成時に、データ・ブロックのサイズを指定できます。データベースによって、Oracleデータ・ブロックの空きデータベース領域が使用され、割り当てられます。エクステント:1つのエクステントは、8ページで構成されます。領域は、すべてのデータベースに対し1回に1つのエクステントずつ割り当てられますエクステント:エクステントは、特定の数の連続したデータ・ブロックで、1回の割当てで取得されます。なしセグメント:セグメントは、特定の論理構造に対して割り当てられるエクステントの集合です。1つのセグメントのエクステントは、ディスク上で連続している必要はありません。複数のデータファイルに分散される場合もあります。セグメント(Oracleの表領域に相当):セグメントは、1つ以上のデータベース・デバイスに指定される名前です。INDEX構文で使用され、これらのオブジェクトを特定のデータベース・デバイスに配置します。必要に応じてSP_EXTENDSEGMENTシステム・プロシージャを使用して、セグメントを拡張し、追加のデバイスを含めることができます。次のセグメントは、データベースとともに作成されます。システム表を格納します。トランザクション・ログを格納します。指定がない場合、他のすべてのデータベース・オブジェクトがこのセグメントに格納されます。セグメントは、データベース・デバイスのサブセットです。Serverのセグメントに相当):データベースは、表領域と呼ばれる論理記憶域の単位に分割されます。表領域は、関連する論理構造をまとめるために使用されます。通常、データベースには、1つのシステム表領域と1つ以上のユーザー表領域が存在します。表領域エクステント:エクステントは、同じ表領域内に存在する特定の数の連続したデータ・ブロックです。表領域セグメント:セグメントは、特定の論理データベース・オブジェクトに対して割り当てられるエクステントの集合です。1つのオブジェクトに対して割り当てられるすべてのセグメントは、同じ表領域に存在する必要があります。必要に応じて、セグメントは、セグメント自身に割り当てられるエクステントを取得します。セグメントには、次の4つの異なる種類があります。各表に、1つのデータ・セグメントがあります。表のすべてのデータは、その表のデータ・セグメントのエクステントに格納されます。Oracleでは、表をクラスタとして格納できます。クラスタは、まとめて格納される複数の表の集合です。各クラスタに、1つのデータ・セグメントがあります。クラスタ内の各表のデータは、クラスタのデータ・セグメントに格納されます。各索引には、索引のすべてのデータを格納する索引セグメントがあります。UNDO情報を一時的に格納するために、データベースのDBAによって、1つ以上のロールバック・セグメントが作成されます。UNDO情報は、コミットされていないすべてのトランザクションの情報です。コミットされていないトランザクションをロールバックするデータベース・リカバリ時に、この情報を使用して、読取り一貫性のあるデータベース情報が生成されます。SQL文の実行を完了するために、一時的な作業領域が必要な場合に、Oracleによって一時セグメントが作成されます。SQL文の実行終了時に、一時セグメントのエクステントは、将来の使用に備えてシステムに戻されます。ログ・デバイス:これは、論理デバイスで、ログを格納するために割り当てられます。ログを格納するデータベース・デバイスは、データベースの作成時に指定できます。REDOログ・ファイル:各データベースには、複数のREDOログ・ファイルがあります。データベースに対して実行されたすべての変更は、REDOログに記録されます。REDOログ・ファイルは、データベースを障害から保護するために重要です。Oracleでは、REDOログ・ファイルをミラー化して、これらのファイルの複数のコピーを保持できます。これによって、REDOログ・ファイルが格納されているハードウェア障害からログ・ファイルを保護します。データベース・デバイス:データベース・デバイスには、データベース・オブジェクトが含まれます。論理デバイスは、特定の物理デバイスまたはファイル・システムのファイルを参照するとはかぎりません。データベースおよびログは、データベース・デバイスに格納されます。各データベース・デバイスは、データベース記憶域として使用する前に、初期化する必要があります。データベース・デバイスの初期化では、記憶域用のデバイスを初期化し、デバイスをサーバーに登録します。初期化が完了すると、このデバイスに対し次の処理を実行できます。データベースで使用できる空き領域への割当て特定のユーザー・オブジェクトを格納するための割当てデータベースのトランザクション・ログの格納データベース・オブジェクトを作成および変更するためのデフォルト・デバイスとしてのラベル付けSP_HELPDEVICESシステム・プロシージャでは、サーバーに登録されているすべてのデバイスが表示されます。DEVICE_NAMEコマンドを使用すると、デバイスを削除できます。システム管理者(SA)は、デバイスの削除後に、サーバーを再起動する必要があります。デバイスは、デフォルト・デイバスとしてラベル付けされているため、新しいデータベースの作成時に、デバイスを指定する必要ありません。SP_DISKDEFAULTシステム・プロシージャを使用して、デフォルト・デバイスとしてデバイスをラベル付けします。なしダンプ・デバイス:これは、論理デバイスです。データベースのダンプは、このデバイスに格納されます。DATABASEコマンドは、ダンプ・デバイスを使用して、データベースをダンプします。なしなし制御ファイル:各データベースに、1つの制御ファイルがあります。このファイルには、データベースの物理構造が記録されます。このファイルには、次の情報が含まれます。データベース名データベースのデータファイルおよびREDOログ・ファイルの名前および位置データベース作成時のタイムスタンプ制御ファイルは、ミラー化することができます。Oracleデータベースのインスタンスを起動するたびに、その制御ファイルが使用され、データベース、データの物理構造およびデータベース操作を進めるためにオープンする必要があるREDOログ・ファイルが識別されます。必要に応じて、制御ファイルはリカバリにも使用されます。Serverのマスター・データベースに類似した情報が格納されます。推奨事項:記憶域構造の概念の違いは、変換処理には直接影響しません。物理的な記憶域構造を準備してから、データベースの変換を開始する必要があります。Serverのそれぞれに、データベース・オブジェクトの物理的な配置を制御する方法があります。SEGMENT句を使用し、OracleではTABLESPACE句を使用します。ServerからOracleへの変換時には、可能なかぎり多くの記憶域情報を保持するようにします。Serverのデータベース・オブジェクトの記憶域を定義する際に決定した事項は、Oracleにも適用する必要があります。オブジェクトの初期サイズおよび物理オブジェクトの配置は重要です。ServerとOracleデータベースのデータ操作言語(DML)要素の構文と内容を比較します。各表の後で、表の情報に基づく推奨事項を示します。この項では、次の項目について説明します。表2-5に示す文は、ユーザーをデータベースに接続します。role説明:デフォルトのデータベースが各ユーザーに割り当てられます。ユーザーがサーバーにログインすると、このデータベースがカレントになります。DATABASE_NAMEコマンドを実行します。ServerとOracleデータベースで異なります。Serverのユーザーは、サーバーにログインして、サーバーに存在する他のデータベースに切り替えることができます。切り替えるデータベースのアクセス権を所有している必要があります。Oracleサーバーは、1つのデータベースのみを制御するため、ここでは、サーバー上のデータベースの切替えについては説明していません。ROLEコマンドを実行してロールを変更するか、別のuser_nameを使用してCONNECTコマンドを再発行します。表2-6に示す文は、1つ以上の表またはビューから行を取得します。}alias]}説明:DISTINCTは、重複する行を排除します。INTO句およびコマンド構文でその句に続く項目はオプションです。Serverでは、FROM句なしでSELECT文を使用できるためです。getdate()SELECT...INTOを使用すると、SELECT文の結果を表に挿入できます。SELECT_LISTには、列指定のかわりにSELECT文を含めることができます。10また、前述の例では、列別名の書式も示しています。selected_columnCOMPUTEは、計算した結果を問合せの最後に加えます。この値は、row_aggregatesと呼ばれます。BY句を使用する場合は、すべての非集計選択列が必要です。BROWSEキーワードを使用します。このモードでは、OLTP環境のデータの表示中に、更新を実行する機能がサポートされます。このモードは、DB-Libraryおよびホスト・プログラミング言語を使用するフロントエンドのアプリケーションで使用されます。データの整合性は、マルチ・ユーザー環境のTIMESTAMPフィールドを使用して維持されます。選択した行はロックされません。このため、トランザクションの実行中も同じ行を表示できます。選択した時間以降、行のTIMESTAMPが変更されていない場合、ユーザーは行を更新できます。説明:DISTINCTは、重複する行を排除します。FROM....構文を使用すると、SELECT文の結果を表に挿入できます。ALIASは、選択したCOLUMNの後に別名を直接指定することで定義されます。ALIASを使用する場合、TABLEは、常にALIASを使用して参照する必要があります。SYNONYMSからデータを取得することもできます。関数の組み合せ、または複数の擬似列の1つにすることができます。BY句に指定する必要があります。UPDATE句を使用すると、問合せで選択された行をロックできます。ロックした行は、トランザクションが終了するまで、他のユーザーによるロックはできません。BROWSEモードと完全に同じわけではありません。Serverでは、FROM句を指定しないSELECT文がサポートされます。getdate()Oracleでは、FROM句を指定しないSELECT文はサポートされません。Oracleでは、常に1行が格納されているDUAL表が提供されます。DUAL表を使用すると、前述のような問合せの構文を変換できます。前述の問合せを次のように変換します。INTO文では、行を表に挿入できます。この構文は、SELECT部分とINSERT部分で構成され、ANSIではサポートされていません。Oracleでは、これらの文をINSERT...SELECT文に置き換えます。Serverの構文があるとします。where_clauseOracleでは、前述の構文を次のように変換する必要があります。Serverの次のような構文から変換します。tab1eOracleの次のような構文に変換します。Serverでは、Oracle形式の列別名もサポートされます。表の別名:表の別名(相関名ともいう)がいずれの場所でも使用されていない場合に、その別名を削除します。計算:COMPUTE句を他のSELECTに置き換えます。UNION句を使用して、2つの結果を結合します。Serverの同じ文との比較を示します。ServerOracle構文:SELECT文の項を参照してください。構文:SELECT文の項を参照してください。BY句には、非集計選択列を指定する必要があります。BY句には、すべての非集計選択列を指定する必要があります。次の表に示す文は、1つ以上の行を表またはビューに追加します。query...};説明:INTOはオプションです。いずれか1つの実表が変更されている場合にのみ、ビューへの挿入が可能になります。説明:INTOは必須です。挿入は単一表ビューでのみ実行できます。Serverの元のINSERT文にINTO句が指定されていない場合は、INTO句を含めるために変更する必要があります。いずれのデータベースでも、VALUES句で指定された値には、関数が含まれます。Server固有の関数は、Oracleの同等の構文に置き換える必要があります。Serverのほとんどの関数に完全に一致する関数を作成できます。Serverの複数表ビューへの挿入を変換して、Oracleの基礎となる表に直接挿入します。表2-9に示す文は、表のデータまたはビューによって参照される表のデータを更新します。cursor}]説明:FROMを使用すると、1つ以上の表から更新する表にデータを取得したり、更新する行を検証できます。複数表ビューを使用した更新では、基礎となる1つの表の列のみを変更できます。説明:単一の副問合せで、複数列をまとめて更新できます。この副問合せでは、SET句の列のリストで使用されている数と同じ数の(互換性のあるデータ型を持つ)列を選択する必要があります。cursor句を使用すると、UPDATE文は、その時点で最後に実行したFETCH結果としてカーソルに存在する単一行のみに影響します。UPDATE句に含まれている必要があります。更新は単一表ビューでのみ実行できます。推奨事項:FROM句を指定したUPDATE文を変換するには、次の項に説明する2つの方法があります。FROM句を使用したUPDATE文の変換:列が別の表からの値に更新されている場合は、SET句に副問合せを使用します。Serverの例を変換します。age'次のようなOracleの問合せに変換します。FROM句を使用したUPDATE文の変換:他のすべてのUPDATE...FROM文のWHERE句に副問合せを使用します。Serverの例を変換します。"USA"次のようなOracleの問合せに変換します。表2-10に示す文は、表から行を削除し、ビューで参照されている表から行を削除します。FROMの最初のFROMはオプションです。Serverの拡張機能です。この拡張機能を使用すると、ユーザーは別の表のデータに基づいて削除を行えます。WHERE句の副問合せも同じ用途で使用されます。削除は単一表ビューを介してのみ実行できます。説明:FROMはオプションです。ALIASは相関名として表名に指定でき、条件で使用できます。削除は単一表ビューを介してのみ実行できます。2つ目のFROM句の削除:DELETE文から2つ目のFROM句を削除します。Serverの問合せを変換します。'business'次のようなOracleの問合せに変換します。'business')WHEREに複数列のJOINが含まれる場合でも2つ目のFROMを削除します。Serverの問合せを変換します。'd'次のようなOracleの問合せに変換します。ServerとOracleデータベースで使用される様々な演算子を比較します。ServerとOracleデータベースで使用される演算子を比較します。比較演算子は、値を比較するためにWHERE句およびCOLUMNのチェック制約または規則で使用されます。>を>=と<=に変換します。Serverの例を変換します。100次のようなOracleの構文に変換します。]と[^]を使用したlike比較演算子を変換します。"[A-F]%"NULL構文を変更します。表2-12に示すとおり、OracleではNULLはNULLと同じではありません。NULLに変更します。Serverの例を変換します。NULL次のようなOracleの構文に変換します。ServerのみOracleのみ連結s+||リテラルの指定'文字列'"文字列"推奨事項:すべての追加文字列を||構文に置き換えます。すべての二重引用符の文字列識別子を一重引用符の識別子に置き換えます。Serverでは、空の文字列('')はINSERT内の単一の空白またはVARCHARデータへの割当て文として解釈されます。VARCHAR、CHARまたはTEXTデータの連結では、空の文字列は単一の空白と解釈されます。空の文字列はNULLとして解釈されません。アプリケーションを変換する場合は、この点について注意する必要があります。ServerのみOracleのみ論理積&論理和|排他的論理和^否定~推奨事項:Oracleでは、ビット単位の操作を実行するためのプロシージャを作成することはできます。Serverの構文を変換します。(x,y)というプロシージャを作成し、前述の構文を次のようなOracleの構文に変換します。ServerとOracleデータベースで使用される様々な関数を比較します。内容は次のとおりです。ServerOracle説明ascii(char)ascii(char)文字と同等のASCIIを返します。char(integer_expression)chr(integer_expression)ASCII文字の10進コードを対応する文字に変換します。1)char_stringでspecified_expが最初に出現する位置を返します。[format])to_char、to_number、to_date、to_label、chartorowid、rowtochar、hextochar、chartohexオプションの書式を使用して、あるデータ型を別のデータ型に変換します。機能の大部分を一致させることができます。SQLリファレンス』を参照してください。datalength(expression)g式に割り当てられた長さを計算し、結果をバイト単位で返します。character_exp)d2つの文字列のSOUNDEX値の数値の差異を返します。new_value)変数値がNULLの場合に、new_valueを返します。lower(char_exp)lower(char_exp)大文字を小文字に変換します。ltrim(char_exp)ltrim(char_exp)char_expの左端の後続空白を切り捨てます。patindex(pattern,column_name)列値内のパターンの位置を返します。パターンにはワイルド・カードを含めることができます。この関数は、TEXTおよびBINARYデータ型でも機能します。'')char_expがn回繰り返される文字列を作成します。reverse(char_string)指定したchar_stringを反転させます。(length(char_exp)文字列のうち、nで指定した位置から繰り上がって、文字列の左端までの部分を返します。rtrim(char_exp)rtrim(char_exp)char_expの右端の後続空白を切り捨てます。soundex(exp)soundex(exp)指定された式と発音が類似している式を返します。'')int_expの空白を持つ文字列を生成します。start+length)char_exp内のサブストリングをreplace_strに置き換えます。length)IMAGEおよびTEXTデータ型で機能します。length)LONGおよびLONG_RAWデータ型では機能しません。char_exp内のサブストリングをreplace_strに置き換えます。textptr(column_name)d名前付きのIMAGEまたはTEXT列のポインタをvarbinary(16)データ型として返します。text_pointer)h指定されたcolumn_nameに対して、text_pointerが有効な場合に1を返します。列はTEXTまたはIMAGE型である必要があります。upper(char_exp)upper(char_exp)小文字を大文字に変換します。ServerOracle説明datalength(expression)lengthb式に割り当てられた長さを計算し、結果をバイト単位で返します。new_value)変数値がNULLの場合に、new_valueを返します。Serverのすべての文字操作関数が示されています。Oracleの関数についてはすべてを示していません。Oracleには、この他にも多くの文字操作関数があります。Oracleでの関数の定義:Oracleには関数を定義する機能が追加されています。Serverの関数の名前および機能と一致するOracleの関数を作成できます。daysint_expの日数をdatetime_varに含まれている日付に追加します。daysint_expの月数をdatetime_varに含まれている日付に追加します。daysint_expの年数をdatetime_varに含まれている日付に追加します。datetime1,datetime2)date2-date1datetime1およびdatetime2変数に指定された日付の差異を返します。この差異は日数で計算されます。date1)datetime1およびdatetime2変数に指定された日付の差異を返します。この差異は月数で計算されます。/365.254datetime1およびdatetime2変数に指定された日付の差異を返します。この差異は年数で計算されます。format)指定された日付の一部を整数として返します。ServerのDATETIMEは、OracleのDATEより高い精度を持ちます。Serverのdatepartと一致するOracleの同等の書式の文字列を検出できない場合があります。DATETIMEデータ型の変換の詳細は、この章の「データ型」を参照してください。format)指定された日付の一部を文字列(名前)として返します。ServerのDATETIMEは、OracleのDATEより高い精密を持ちます。Serverのdatepartと一致するOracleの同等の書式の文字列を検出できない場合があります。getdate()sysdateシステム日付を返します。Serverのすべての日付操作関数が示されています。Oracleの関数についてはすべてを示していません。Oracleには、この他にも多くの日付操作関数があります。Oracleでは、ほとんどの日付操作関数を「+」または「-」に変換することをお薦めします。Oracleには関数を定義する機能が追加されています。Serverのすべての関数の名前および機能と一致するOracleの関数を作成できます。BY句およびHAVING句からPL/SQLファンクションをコールできるため、この機能を使用することをお薦めします。パラレル問合せオプションを使用すると、OracleはPL/SQLファンクションをSQL文とパラレルに実行します。したがって、ユーザーはパラレル・ロジックを作成します。Serverのすべての数値操作関数が示されています。Oracleの関数については、すべてを示していません。Oracleには、この他にも多くの数値操作関数があります。Oracleには関数を定義する機能が追加されています。Serverのすべての関数の名前および機能と一致するOracleの関数を作成できます。これは最も柔軟な方法です。ユーザーは独自の関数を作成し、これらをSQL文から透過的に実行できます。表に示すOracleの関数は、SQLおよびPL/SQLで機能します。ServerとOracleデータベースのロックおよびトランザクション処理を比較します。内容は次のとおりです。論理トランザクション処理ロックロックは同時実行性の制御メカニズムとして機能します。複数ユーザー環境では、一度に複数のユーザーが同一のデータを処理する場合があるためロックが必要です。Serverのロックは完全に自動で、手動での操作は不要です。Serverでは、INSERT、UPDATEおよびDELETE操作に対して排他ロックが適用されます。排他ロックが設定されている場合、他のトランザクションは、元のロックが設定されるまでそのオブジェクト上のすべての種類のロックを取得できません。更新しない操作または読取り操作の場合、共有ロックが適用されます。共有ロックが表またはページに適用される場合、他のトランザクションはその表またはページ上の共有ロックを取得できます。いずれのトランザクションも排他ロックは取得できません。Serverの読取りではデータに対する変更がブロックされます。更新ロック:更新ロックはページ・レベルで保持されます。更新ロックは、ページの読取り中に更新操作の初期段階で設定されます。更新ロックは共有ロックとあわせて設定できます。ページが後で変更された場合、更新ロックは排他ロックになります。Oracleのロックは完全に自動で、手動での操作は不要です。次のロックがOracleの特徴です。データ・ロック(DMLロック)は、データを保護します。表ロックは表全体を、行ロックは各行をロックします。ディクショナリ・ロック(DDLロック)は、オブジェクト構造を保護します。内部ロックは、ファイルなどの内部構造を保護します。DML操作では2つの異なるレベル(指定した行または表全体に対して)でデータ・ロックを取得できます。行レベル・ロック:排他ロックは、行がDML文によって変更される場合にトランザクションの対象の各行に対して取得されます。トランザクションが行レベル・ロックを取得する場合、対応する表に対する表(ディクショナリ・)ロックも取得します。TABLE)操作の競合を回避できます。Serverのロックは完全に自動で、手動での操作は不要です。Serverでは、INSERT、UPDATEおよびDELETE操作に対して排他ロックが適用されます。排他ロックが設定されている場合、他のトランザクションは、元のロックが設定されるまでそのオブジェクト上のすべての種類のロックを取得できません。更新しない操作または読取り操作の場合、共有ロックが適用されます。共有ロックが表またはページに適用される場合、他のトランザクションはその表またはページ上の共有ロックを取得できます。いずれのトランザクションも排他ロックは取得できません。Serverの読取りではデータに対する変更がブロックされます。エクステント・ロック:エクステント・ロックは、8ページのデータベース・ページの割当てまたは解放が行われる場合にこれらのページのグループをロックします。これらのロックは、CREATEまたはDROP文の実行中、または新しいデータまたは索引ページを要求するINSERT文の実行中に保持されます。現行のサーバーのアクティブなロックのリストは、SP_LOCKシステム・プロシージャを参照してください。表レベル・データ・ロックは次のいずれかのモードで保持できます。行共有表ロック(RW):これは、表上のロックを保持しているトランザクションは表の行をロックし、それらを更新しようとしていることを示します。MODE文を使用して、同一の表への排他的書込み権限を取得することが回避されます。これ以外については、その表で、すべての問合せ、挿入、削除および更新が可能です。行排他表ロック(RX):通常、これはロックを保持しているトランザクションがその表の行に対して1回以上の更新を行ったことを示します。その表で、問合せ、挿入、削除および更新が可能です。共有ロック(SL)共有行排他ロック(SRX)排他ロック(X)動的パフォーマンス表V$LOCKがロックに関する情報を保持します。Serverでは、SELECT文はページまたは行(あるいはその両方)の共有ロックを取得します。これによって、他の文がそれらのページまたは行(あるいはその両方)の排他ロックを取得することを回避できます。データを更新するすべての文では排他ロックが必要です。ServerのSELECT文は、SELECT文を含むトランザクションがコミットまたはロールバックを実行しないかぎりUPDATE文をブロックすることを意味します。これは2つのトランザクションで、一方のトランザクションがデータを選択し、もう一方のトランザクションがデータを変更してからデータを再選択する場合、これらのトランザクションが物理的にシリアライズされることも意味します。Oracleでは、ロールバック・セグメントは変更されたデータが実際の表で更新される前に、このデータを格納するために使用されるため、SELECT文はUPDATE文をブロックしません。Oracleではデータ・リーダーもブロックされません。これによって、Oracleではトランザクションを同時に実行できます。Serverでは適切に実行される前述のトランザクションによって、Oracleではデッドロックが発生します。デッドロックを回避するために、これらのトランザクションを識別およびシリアライズする必要があります。ServerではINSERT、UPDATEおよびDELETE文がその他の文をブロックする場合にシリアライズされます。Serverには、行レベル・ロック機能はありません。Serverでは、ページ・レベル・ロックが適用されます。このロックは、ページ内のいずれかの行の更新中は、常にページ上のすべての行を事実上ロックします。このロックでは、DML文によるデータの変更中は、常に排他ロックとなります。7.0では、行レベル・ロック形式が実装されます。7.0では、自動的にロックが行レベルからページ・レベルになります。SELECT文は、ページ全体をロックする排他ロックによってブロックされます。Oracleには、行ロック機能があります。DML文による行の変更中は、その1行のみがロックされます。推奨事項:Oracleの行レベル・ロック機能を使用するための変更は必要ありません。Serverは、トランザクション・レベルの読取り一貫性にHOLDLOCK機能を提供します。HOLDLOCKを使用してSELECTを指定すると、データに対し共有ロックがかかります。複数のユーザーが互いにブロックすることなく、同時にHOLDLOCKを使用したSELECTを実行できます。選択されているデータを、ユーザーの1人が更新しようとした場合は、HOLDLOCKによって、他のユーザーが更新をコミットまたはロールバックするまで、または更新を試行してデッドロックが発生するまで、その更新がブロックされます。HOLDLOCKは、現行のトランザクションが有効になるまで、他のトランザクションによる同じデータの更新を防ぎます。Oracleでサポートする読取り一貫性では、次の内容が保証されます。文によって参照されるデータ・セットが、単一のある時点で一貫性があり、文の実行中は変更されない。データベースのデータの読取りは、同じデータの他の読取りまたは書込みを待機しない。データベースのデータの書込みは、同じデータの読取りを待機しない。書込みは、同時に発生したトランザクションでの同じ行の更新を試行する場合のみ、他の書込みを待機する。読取り一貫性を提供するために、Oracleでは、表が読み取られ、同時に更新される場合に、読取り一貫性のあるデータ・セットが作成されます。読取り一貫性機能は、次のとおりです。更新が発生した場合、更新によって変更される元のデータ値は、ロールバック・セグメントに記録されます。更新のトランザクションがすべてコミットされるまでは、その変更済のデータに対して読取りを実行するユーザーには、元のデータ値が表示されます。他のユーザーのトランザクションがコミットされてから開始する文のみが、そのトランザクションによる変更を反映します。次のコマンドを使用して、トランザクションを読取り専用に指定できます。ServerOracle処理の完了後、トランザクションにないすべての文は自動的にコミットされます。複数のT-SQL文を一度にサーバーに送信するように、文をバッチ化できます。データベースへの変更は、バッチの実行後に、自動的にコミットされます。TRAN文は、無効となります。Serverでは、トランザクションは暗黙的ではありません。TRANSACTION句を使用して、論理トランザクションを開始します。論理トランザクションは、次のようにコミットまたはロールバックできます。TRANを使用して、データベースに対しトランザクションをコミットします。トランザクション名を指定することもできます。TRANを使用して、トランザクションをロールバックします。次のコマンドを使用して、セーブポイントを設定すると、論理トランザクション内の特定のポイントまでロールバックできます。savepoint_name次のコマンドを使用すると、指定したセーブポイントまでロールバックできます。<savepoint_name>文は、自動的にデータベースにコミットされます。WORK文を実行する必要があります。Oracleでは、トランザクションは暗黙的です。データベース内のデータ変更の直後に、論理トランザクションが開始します。WORKは、データベースに対し保留状態にある変更をコミットします。WORK文を実行した後のすべてのトランザクションを取り消します。次のコマンドを使用して、トランザクションにセーブポイントを設定できます。savepoint_name次のコマンドを使用すると、指定したセーブポイントまでロールバックします。<savepoint_name>Oracleでは、2フェーズ・コミットは自動的で透過的です。2フェーズ・コミット操作は、複数のデータベースのデータを変更するトランザクションに対してのみ必要です。TRAN文をネストできます。ネストした場合は、最も外側のトランザクションの組が、トランザクションを作成しコミットします。内側の組は、ネスト・レベルを保持します。TRANレベルまでロールバックします。Serverのほとんどのアプリケーションでは、単一サーバー上でも、2フェーズ・コミットが必要です。TRANを使用します。完了済のトランザクションは、チェックポイントでデータベース・デバイスに書き込まれます。チェックポイントでは、最後のチェックポイントからのすべての使用済ページがディスク・デバイスに書き込まれます。リモート・プロシージャへのコールは、そのプロシージャが含まれているトランザクションとは別に実行されます。チェックポイントが発生した場合、完了済のトランザクションはデータベース・デバイスに書き込まれます。チェックポイントでは、最後のチェックポイント後に変更されたすべての使用済ページがディスク・デバイスに書き込まれます。Serverでは、トランザクションは暗黙的ではありません。したがって、アプリケーションによって発行されるすべての文は、実行されるたびに自動的にコミットされることが想定されています。通常、Oracleのトランザクションは暗黙的です。個々の文が自動的にコミットされることはありません。ServerのアプリケーションをOracleのアプリケーションに変換する場合、そのアプリケーションでトランザクションを構成しているものを判別するには注意が必要です。Serverの動作をレプリケートする必要があります。TRAN文を発行して、クライアント・アプリケーションから明示的にトランザクションを開始することもできます。