ヘッダーをスキップ
Oracle® SQL Developer Microsoft SQL ServerおよびSybase Adaptive Serverからの移行のための追加情報
リリース3.0
B66848-01
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次
索引へ移動
索引

前
 
次
 

2 Microsoft SQL Server、Sybase Adaptive ServerおよびOracleの比較

この章では、Microsoft SQL ServerまたはSybase Adaptive ServerデータベースとOracleデータベースの違いについて説明します。内容は次のとおりです。

2.1 スキーマの移行

スキーマには、表、ビュー、索引、ユーザー、制約、ストアド・プロシージャ、トリガーおよびデータベース固有のその他のオブジェクトの定義が含まれています。ほとんどのリレーショナル・データベースは、類似したオブジェクトとともに動作します。

この項では、次の項目について説明します。

2.1.1 スキーマ・オブジェクトの類似点

OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverのスキーマ・オブジェクトには、多くの類似点があります。ただし、一部のスキーマ・オブジェクトでは、これらのデータベース間で異なるものがあります。次の表を参照してください。

表2-1 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverのスキーマ・オブジェクト

Oracle Microsoft SQL ServerまたはSybase Adaptive Server

データベース

データベース

スキーマ

データベースおよびデータベース所有者(DBO)

表領域

データベース

ユーザー

ユーザー

ロール

グループ/ロール

一時表

一時表

クラスタ

なし

列レベルのチェック制約

列レベルのチェック制約

列デフォルト

列デフォルト

一意キー

一意キーまたは列の識別プロパティ

主キー

主キー

外部キー

外部キー

索引

非一意索引

PL/SQLプロシージャ

Transact SQL(T-SQL)ストアド・プロシージャ

PL/SQLファンクション

T-SQLストアド・ファンクション

パッケージ

なし

AFTERトリガー

トリガー

BEFOREトリガー

複合ルール

各行に対するトリガー

なし

シノニム

なし

順序

列に対する識別プロパティ

スナップショット

なし

ビュー

ビュー


2.1.2 スキーマ・オブジェクト名

予約語は、OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverで異なります。Oracleの予約語の多くは、Microsoft SQL ServerまたはSybase Adaptive Serverでの有効なオブジェクトまたは列の名前です。たとえば、DATEはOracleの予約語ですが、Microsoft SQL ServerまたはSybase Adaptive Serverの予約語ではありません。したがって、Oracleでは列名にDATEを使用できませんが、Microsoft SQL ServerまたはSybase Adaptive Serverでは列名にDATEを使用できます。スキーマ・オブジェクト名に予約語を使用すると、同じ名前を複数のデータベースにわたって使用できなくなります。

大文字/小文字の区別以外に、1つ以上の特性が他のスキーマ・オブジェクトとは異なるスキーマ・オブジェクト名を選択し、そのオブジェクト名がいずれのデータベースでも予約語ではないことを確認する必要があります。

Oracleの予約語のリストは、『Oracle Database SQL言語リファレンス』を参照してください。

2.1.3 表の設計上の考慮事項

この項では、Microsoft SQL ServerまたはSybase Adaptive ServerデータベースをOracleに変換する際に考慮が必要な、表の設計上の多くの問題について説明します。次の項目について説明します。

2.1.3.1 データ型

ここでは、次のデータ型の変換時における考慮事項について説明します。

2.1.3.1.1 DATETIMEデータ型

Microsoft SQL ServerまたはSybase Adaptive Serverの日時の精度は、1/300秒です。OracleのTIMESTAMPデータ型の精度は、1/100000000秒です。また、OracleにはDATEデータ型もあり、秒単位で正確な日時の値が格納されます。SQL Developerには、DATEデータ型に対するデフォルトのマッピングがあります。

日時に秒単位より高い精度を必要とするアプリケーションでは、Microsoft SQL ServerまたはSybase Adaptive ServerのDATEデータ型のデータ型マッピングにTIMESTAMPデータ型を選択する必要があります。データベースでは、DATEおよびTIMEデータ型に対し時間の値が格納されます。

別の方法として、Microsoft SQL ServerまたはSybase Adaptive Serverアプリケーションが時間の値のかわりに、DATETIME列を使用して一意のIDを提供している場合は、DATETIME列をOracleスキーマ定義のSEQUENCEに置き換えます。

次の例では、元の設計のDATETIMEの精度をOracle表で秒単位より高い精度にすることはできません。この例では、DATETIME列は一意のIDを提供するために使用すると想定しています。ミリ秒単位の精度を必要としない場合は、次の例に示す表の設計で十分です。

元の表設計

Microsoft SQL ServerまたはSybase Adaptive Server:

CREATE TABLE example_table
(datetime_column    datetime        not null,
text_column         text            null,
varchar_column      varchar(10)     null)

Oracle:

CREATE TABLE example_table
(datetime_column    date            not null,
text_column         long            null,
varchar_column      varchar2(10)    null)

次の設計では、順序の値をinteger_columnに挿入できます。これによって、OracleのDATEデータ型フィールドで許容される1秒単位の精度を超えて、表の行を順序付けできます。この列をMicrosoft SQL ServerまたはSybase Adaptive Serverの表に含めると、Oracle Databaseに対して同じ表設計を保持できます。

修正された表設計

Microsoft SQL ServerまたはSybase Adaptive Server:

CREATE TABLE example_table
(datetime_column    datetime        not null,
integer_column      int             null,
text_column         text            null,
varchar_column      varchar(10)     null)

Oracle:

CREATE TABLE example_table
(datetime_column    date            not null,
integer_column      number          null,
text_column         long            null,
varchar_column      varchar2(10)    null)

Microsoft SQL ServerまたはSybase Adaptive Serverデータベースの場合、integer_columnの値は、常にNULLです。Oracleの場合、integer_columnフィールドの値は、順序の次の値に更新されます。

順序を作成するには、次のコマンドを発行します。

CREATE SEQUENCE datetime_seq

この順序に対して生成される値は、1から始まり、1ずつ増加します。

一意のIDとしてDATETIMEの値を使用するアプリケーションは多くはありませんが、日時の精度には秒単位より高い精度が必要です。たとえば、科学アプリケーションのタイムスタンプには、ミリ秒、マイクロ秒およびナノ秒単位での表現が必要となる場合があります。Microsoft SQL ServerまたはSybase Adaptive ServerのDATETIMEデータ型の精度は1/300秒であり、OracleのDATEデータ型の精度は1秒です。OracleのTIMESTAMPデータ型の精度は、1/100000000秒です。ただし、記録される精度は、オペレーティング・システムによって異なります。

2.1.3.1.2 IMAGEおよびTEXTデータ型(バイナリ・ラージ・オブジェクト)

IMAGEおよびTEXTデータの物理的および論理的な格納方法は、OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverとでは異なります。Microsoft SQL ServerまたはSybase Adaptive Serverでは、IMAGEまたはTEXTデータは別々に格納されますが、IMAGEまたはTEXTデータへのポインタは表の行とともに格納されます。この処理によって、1つの表にIMAGEまたはTEXTデータの複数の列が許可されます。Oracleでは、IMAGEデータはBLOB型のフィールドに格納され、TEXTデータはCLOB型のフィールドに格納されます。Oracleでは、1つの表にBLOBおよびCLOBの複数の列を許可します。BLOBおよびCLOBは、そのサイズによっては、行に格納されない場合があります。

Microsoft SQL ServerまたはSybase Adaptive ServerのTEXT列でデータが4000バイトを超えない場合は、この列をOracleのCLOB列ではなくVARCHAR2データ型列に変換します。Oracle表では、複数のVARCHAR2列を定義できます。TEXTデータのこのサイズは、ほとんどのアプリケーションに適しています。

2.1.3.1.3 Microsoft SQL ServerまたはSybase Adaptive Serverのユーザー定義データ型

Microsoft SQL ServerまたはSybase Adaptive ServerのSQLに対するT-SQL固有のこの拡張機能を使用すると、ユーザー固有のデータ型を定義および名前付けして、システム・データ型を補うことができます。ユーザー定義データ型は、データベースのいずれの列のデータ型として使用できます。デフォルトおよびルール(チェック制約)は、これらのユーザー定義データ型にバインドすることができ、これらのユーザー定義データ型の個々の列に自動的に適用されます。

Oracle PL/SQLへの移行時に、SQL Developerは各ユーザー定義データ型に対するベース・データ型を決定し、同等のPL/SQLデータ型を検出します。


注意:

ユーザー定義データ型を使用すると、異なるデータベース・サーバー間でのデータ定義言語コードおよび手続き型SQLコードの移植性が低くなります。

2.1.3.2 エンティティ整合性制約

Microsoft SQL ServerまたはSybase Adaptive Serverでは、表に対して主キーを定義できます。主キーは、CREATE TABLE文またはALTER TABLE文で定義できます。

Oracleでは、宣言的な参照整合性が提供されます。主キーは、CREATE TABLE文またはALTER TABLE文の一部として定義できます。Oracleでは、整合性を向上させるために、内部的に一意索引が作成されます。

2.1.3.3 参照整合性制約

Microsoft SQL ServerまたはSybase Adaptive Serverでは、表に対して外部キーを定義できます。外部キーは、CREATE TABLE文またはALTER TABLE文で定義できます。

Oracleでは、宣言的な参照整合性が提供されます。CREATE TABLE文またはALTER TABLE文を使用すると、外部キーを表定義に追加できます。参照整合性制約については、『Oracle Database概要』を参照してください。

2.1.3.4 一意キー制約

Microsoft SQL ServerまたはSybase Adaptive Serverでは、表に対して一意キーを定義できます。一意キーは、CREATE TABLE文またはALTER TABLE文で定義できます。

Oracleでは、一意キーをCREATE TABLE文またはALTER TABLE文の一部として定義します。Oracleでは、これらの制約を施行するために、内部的に一意索引が作成されます。

一意キーは、Microsoft SQL ServerまたはSybase Adaptive ServerからOracleへ1対1でマッピングされます。

2.1.3.5 チェック制約

Microsoft SQL ServerまたはSybase Adaptive Serverでは、チェック制約をCREATE TABLE文またはALTER TABLE文で定義できます。1つの表に複数のチェック制約を定義できます。表レベルのチェック制約は、制約付き表のいずれの列も参照できます。1つの列に設定できるのは、1つのチェック制約のみです。列レベルのチェック制約は、制約付き列のみを参照できます。これらのチェック制約は、複雑な正規表現をサポートします。

Oracleでは、チェック制約をCREATE TABLE文またはALTER TABLE文の一部として定義します。チェック制約は、列レベルではなく、表レベルで定義されます。したがって、チェック制約は、表のいずれの列も参照できます。ただし、Oracleでは、複雑な正規表現をサポートしていません。

2.1.3.5.1 Microsoft SQL ServerまたはSybase Adaptive Serverのルール:
create rule phone_rule
as
@phone_number 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-506-7000 650-GET-HELP

Oracleでこの整合性制約を実装するには、次の方法があります。

  • SUBSTR、TRANSLATEおよびLIKE句を組み合せて使用し、チェック制約のphone_ruleの動作をシミュレートする。

  • トリガーを記述し、PL/SQLを使用する。

Microsoft SQL ServerまたはSybase Adaptive Serverデータベースの表レベルのチェック制約は、Oracleのチェック制約に1対1でマッピングされます。Microsoft SQL ServerまたはSybase Adaptive Serverの列レベルのチェック制約は、Oracleの表レベルのチェック制約に実装できます。正規表現の変換では、すべての単純な正規表現はOracleのチェック制約に変換されます。複雑な正規表現を持つMicrosoft SQL ServerまたはSybase Adaptive Serverのチェック制約は、単純な正規表現の組合せで構成されるチェック制約として作成し直すか、またはOracle Databaseトリガーを記述して同じ機能を実現するようにできます。

2.2 データ型

この項では、Microsoft SQL ServerまたはSybase Adaptive ServerデータベースとOracle Databaseで使用するデータ型の違いについて説明します。この項の内容は、次のとおりです。

2.2.1 データ型の表

表2-2 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverのデータ型

Microsoft SQL ServerまたはSybase Adaptive Server 説明 Oracle コメント

INTEGER

4バイト整数、31ビットおよび符号。短縮形は「INT」です(バージョン5より前でこの短縮形が必須)。

NUMBER(10)

この型の列に表の制約を設定して(任意)、値を-231から231にすることができます。または、適切な制約(1から50のSTATE_NOなど)を設定します。

SMALLINT

2バイト整数、15ビットおよび符号。

NUMBER(5)

この型の列に表の制約を設定して(任意)、値を-2^15から2^15にすることができます。または、適切な制約(1から50のSTATE_NOなど)を設定します。

TINYINT

1バイト整数、8ビットおよび符号なし。0から255の数値を格納します。

NUMBER(3)

x(0から255)のチェック制約を追加できます。ここで、xは列名です。

REAL

浮動小数点数。格納は4バイトで、24ビットの2進精度、7桁精度です。

データ範囲は、–3.40E+38から3.40E+38です。

FLOAT

OracleへのREALのANSIデータ型変換は、FLOAT(63)です。デフォルトでは、SQL Developerによって、REALからFLOAT(24)にマッピングされます。このデータ型には、Oracleでは最大8桁の有効桁数を持つ10進数が格納されます。

また、OracleのNUMBER型はREALより精度および移植性が高いため、このデータ型で演算を行うと、異なる結果になります。値の範囲を制限するために、チェック制約を追加できます。また、OracleのNUMBER型はREALより精度および移植性が高いため、このデータ型で演算を行うと、異なる結果になります。Oracleでは、浮動小数点数をFLOAT[(b)]という書式で指定できます。ここで、[(b)]は2進精度bを示し、1から126の範囲で指定できます。[(b)]のデフォルトは126です。特定の2進精度を10進精度に換算するには、[(b)]に0.30103を乗算して、自然数に切り上げます。

FLOAT

浮動小数点数。この列の精度は15桁です。

FLOAT

OracleへのFLOAT(p)のANSIデータ型変換は、FLOAT(p)です。OracleへのDOUBLE PRECISIONのANSIデータ型変換は、FLOAT(126)です。デフォルトでは、SQL Developerによって、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個続く)。

注意: 1.0E+126以上の浮動小数点データを移行すると、SQL Developerは、Oracle Databaseへのこのデータの挿入に失敗し、エラーが戻されます。また、これは-1.0E+126以下の負の値の場合も同じです。




Oracleでは、浮動小数点数をFLOAT[(b)]で指定できます。ここで、[(b)]は2進精度[(b)]を示し、1から26の範囲で指定できます。[(b)]のデフォルトは126です。特定の2進精度を10進精度に換算するには、[(b)]に0.30103を乗算して、自然数に切り上げます。

浮動小数点数が範囲を超えている場合、大きすぎる浮動小数点数では桁あふれ、小さすぎる浮動小数点数では桁落ちが発生します。

BIT

単一バイトの1ビットとして格納されるブール0または1。単一バイトには、表から最大8ビットの列を格納できます(連続していない場合でも)。ビット・データをNULLにすることはできません。ただし、Microsoft SQL Server 7.0では、BITデータ型にNULLが許可されています。

NUMBER(1)

Oracleでは、ビットをNUMBER(1)またはCHARに格納します。Oracleでは、複数のビットをCHARまたはVARCHARフィールドに圧縮して格納し、PL/SQLファンクションによって、それらのビットに対して設定、設定解除、取得、問合せを実行できます。

CHAR(n)

常にn個の8ビット文字を持つ固定長文字列(空白が埋め込まれる)。これは、CHARACTERと同義です。Microsoft SQL ServerまたはSybase Adaptive Serverの場合、nは0より大きく256より小さい値です。Microsoft SQL Server 7.0の場合、nは0より大きく8000より小さい値です。

CHAR(n)

Pro*Cクライアント・プログラムでは、文字列を比較するために、mode=ansiに設定し、文字を正確に解析する必要があります。これ以外の場合は、mode=oracleに設定します。

2001から4000の範囲のCHARデータ型は無効です。SQL Developerによって、この範囲のCHARデータ型は、自動的にVARCHAR2に変換されます。

VARCHAR(n)

可変長文字列。Microsoft SQL ServerまたはSybase Adaptive Serverの場合、nは0より大きく256より小さい値です。Microsoft SQL Server 7.0の場合、nは0より大きく8000より小さい値です。

VARCHAR2(n)

TEXT

2KBページの増分で割り当てられる8ビット・バイトの文字列。「TEXT」は、2024バイト・ページのリンク・リストとして格納されます(空白が埋め込まれる)。TEXT列には、最大231から1を引いた文字数を格納できます。

CLOB

CLOBフィールドには、最大4GBを格納できます。

IMAGE

8ビット・バイトのバイナリ文字列。最大231から1を引いたバイト数のバイナリ・データを格納できます。

BLOB

BLOBフィールドには、最大4GBを格納できます。

BINARY(n)

常にn個の8ビット・バイトの固定長バイナリ文字列。Microsoft SQL ServerまたはSybase Adaptive Serverの場合、nは0より大きく256より小さい値です。Microsoft SQL Server 7.0の場合、nは0より大きく8000より小さい値です。

RAW(n)/BLOB


VARBINARY(n)

最大n個の8ビット・バイトの可変長バイナリ文字列。Microsoft SQL ServerまたはSybase Adaptive Serverの場合、nは0より大きく256より小さい値です。Microsoft SQL Server 7.0の場合、nは0より大きく8000より小さい値です。

RAW(n)/BLOB


DATETIME

2つの4バイト整数で格納される日付および時刻。日付部分は、基準日(1900年1月1日)からのオフセット日数の合計として表され、1つ目の整数部分に格納されます。許容値は、西暦1753年1月1日から9999年12月31日までの有効な日です。時刻部分の許容値は、0から25920000の範囲の有効な時間です。精度は、3.33ミリ秒単位(切捨て)です。DATETIME型の列のデフォルト値は、1900年1月1日です。

DATE

OracleのDATEの精度とMicrosoft SQL ServerまたはSybase Adaptive ServerのDATETIMEの精度は異なります。DATETIMEデータ型は、DATEデータ型より高い精度を持ちます。このため、DATETIME列が一意であると仮定すると、様々な影響が発生します。Microsoft SQL ServerまたはSybase Adaptive Serverでは、DATETIME型の列に一意の値を格納できます。これは、Microsoft SQL ServerまたはSybase Adaptive ServerのDATETIMEの精度が、1/100秒単位であるためです。ただし、Oracleでは、これらの値を一意にすることができません。これは、データの精度が秒単位であるためです。一意の組合せを取得するために、DATETIME列を2つの列(1つはDATEデータ型、もう1つは順序)と置き換えることができます。2番目の列には1/100秒単位の値を格納することをお薦めします。

また、OracleのTIMESTAMPデータ型も使用できます。精度は1/100000000秒です。

SMALL-DATETIME

2つの2バイト整数で格納される日付および時刻。日付の範囲は、1900年1月1日から2079年6月6日です。時刻は、午前0時からの分数の合計です。

DATE

任意でチェック制約を使用すると、より高い精度を有効にできます。

MONEY

整数部分と小数部分で表される通貨の値で、2つの4バイト整数で格納されます。精度は、1/10,000単位です。この型のデータを入力する場合は、データの前にドル記号($)を入力する必要があります。ドル記号($)がない場合、Microsoft SQL ServerまたはSybase Adaptive Serverは、値を浮動小数として作成します。

通貨データの値の範囲は、-922,337,203,685,477.5808から922,337,203,685,477.5807で、精度は通貨単位の1/10,000です。格納サイズは、8バイトです。

NUMBER(19,4)

Microsoft SQL ServerまたはSybase Adaptive Serverでは、先頭にドル記号($)を付けてMONEYデータ型を数値データ型として入力します。たとえば、select * from table_x where y > $5.00のように入力します。Oracleは、より汎用的であり、ドル記号($)の使用が想定されていない様々な国の環境で動作します。Oracleでは、NLSを使用して、他の通貨記号およびISO標準をサポートします。

NCHAR(n)

固定長の文字列データ型。これには、UNICODE UCS-2キャラクタ・セットが使用されます。nの値は、1から4000の範囲である必要があります。SQL ServerまたはSybaseの格納サイズは、nの2倍です。

注意: Microsoft SQL ServerまたはSybase Adaptive Serverの格納サイズは、nの2倍です。SQL Developerでは、バイト・セマンティクスを使用して、列サイズをマッピングします。Microsoft SQL ServerまたはSybase Adaptive ServerのNCHARデータ型のサイズは、Unicodeの文字数ではなく、バイト数を示す「サイズ」でSQL Developerのソース・モデルに表示されます。このため、SQL ServerまたはSybaseのNCHAR(1000)列は、ソース・モデルではNCHAR(2000)として表示されます。

CHAR(n*2)


NVARCHAR(n)

固定長の文字列データ型。これには、UNICODE UCS-2キャラクタ・セットが使用されます。nの値は、1から4000の範囲である必要があります。SQL ServerまたはSybaseの格納サイズは、nの2倍です。

注意: Microsoft SQL ServerまたはSybase Adaptive Serverの格納サイズは、nの2倍です。SQL Developerでは、バイト・セマンティクスを使用して、列サイズをマッピングします。Microsoft SQL ServerのNVARCHARデータ型のサイズは、Unicodeの文字数ではなく、バイト数を示す「サイズ」でSQL Developerのソース・モデルに表示されます。このため、SQL ServerまたはSybaseの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)で十分です。

TIMESTAMP

TIMESTAMPは、VARBINARY(8)で定義されNULLが許可されます。TIMESTAMP列を含む行が更新または挿入されるたびに、システムによってTIMESTAMP列が自動的に増加されます。ユーザーがTIMESTAMP列を更新することはできません。

NUMBER

この型の列を維持するには、この列にトリガーを配置する必要があります。Oracleでは、同じ種類の複数のトリガーを設定できます。複数のトリガーすべてを1つの大きなトリガーに統合する必要はありません。完全な互換性を得るために、この列の更新を停止するトリガーを設定できます。

SYSNAME

Microsoft SQL ServerまたはSybase Adaptive Serverでは、VARCHAR(30)です。

Microsoft SQL Server 7.0では、NVARCHAR(128)です。

それぞれ、VARCHAR2(30)およびVARCHAR2(128)


Microsoft SQL ServerまたはSybase Adaptive ServerのTEXTおよびIMAGEデータ型は、次のルールに従っています。

  • これらのデータ型の列には、索引付けできない。

  • 列を主キーにすることはできない。

  • GROUP BY、ORDER BY、HAVINGおよびDISTINCT句では、列を使用できない。

  • IMAGEおよびTEXTデータ型は、LIKE構文のあるWHERE句で参照できる。

  • IMAGEおよびTEXTデータ型は、SUBSTRおよびLENGTHファンクションとともに使用できる。

Microsoft SQL ServerまたはSybase Adaptive Serverでは、可変長データ型の列のみにNULL値を格納できます。NULLを許可する固定長データ型の列を作成した場合、その列は、自動的にシステム可変長データ型に変換されます(表2-3を参照)。これらの可変長データ型は、システム・データ型として予約され、ユーザーがこれらのデータ型を使用して、列を作成することはできません。

表2-3 NULL値に対するデータ型変換

固定長データ型 可変長データ型

CHAR

VARCHAR

NCHAR

NVARCHAR

BINARY

VARBINARY

DATETIME、SMALLDATETIME

DATETIMN

FLOAT

FLOATN

INT、SMALLINT、TINYINT

INTN

DECIMAL

DECIMALN

NUMERIC

NUMERICN

MONEY、SMALLMONEY

MONEYN



注意:

Oracle SQL Developerのソース・モデルでは、各列がシステム・データ型である表が表示されます。

推奨事項:

Microsoft SQL ServerまたはSybase Adaptive Serverデータベースでは、表2-2に示すデータ型以外にユーザー独自のデータ型を定義できます。これらのユーザー定義データ型は、サーバーによって提供されるベース・データ型に変換されます。これらのベース・データ型では、ユーザーがデータ型を追加して格納することはできませんが、アプリケーション全体の標準データ型の実装に役立ちます。

表2-3に示す等価のデータ型を使用して、Microsoft SQL ServerまたはSybase Adaptive ServerからOracleにデータ型をマッピングできます。SQL Developerでは、ユーザー定義データ型がそのベース型に変換されます。Oracleのデータ型へのベース型のマッピング方法は、「Options」ダイアログ・ボックスの「Data Type Mappings」ページで定義できます。

2.3 データ記憶域の概要

この項では、Microsoft SQL ServerまたはSybase Adaptive ServerデータベースとOracle Databaseのデータ記憶域の概念の違いについて説明します。

この項の内容は、次のとおりです。

2.3.1データ記憶域の概要表

表2-4 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverのデータ記憶域の概要

Microsoft SQL ServerまたはSybase Adaptive Server Oracle

データベース・デバイス:

データベース・デバイスは、指定した物理ディスク・ファイルにマッピングされます。

データファイル:

1つ以上のデータファイルが各表領域に対して作成され、すべての論理構造のデータが表領域に物理的に格納されます。表領域内での結合されたデータファイルのサイズは、表領域の合計記憶域容量になります。データベース内での結合された表領域の記憶域容量は、データベースの合計記憶域容量になります。データファイルは一度作成すると、サイズを変更できません。この制限は、Oracleにはありません。

ページ:

複数のページによって、データベース・デバイスが構成されます。各ページには、特定のバイト数が含まれます。

データ・ブロック:

1つのデータ・ブロックは、ディスクの物理データベース領域の特定のバイト数に相当します。データベースの作成時に、データ・ブロックのサイズを指定できます。データベースによって、Oracleデータ・ブロックの空きデータベース領域が使用され、割り当てられます。

エクステント:

1つのエクステントは、8ページで構成されます。領域は、すべてのデータベースに対し1回に1つのエクステントずつ割り当てられます

エクステント:

エクステントは、特定の数の連続したデータ・ブロックで、1回の割当てで取得されます。

なし

セグメント:

セグメントは、特定の論理構造に対して割り当てられるエクステントの集合です。1つのセグメントのエクステントは、ディスク上で連続している必要はありません。また、複数のデータファイルに分散される場合もあります。

セグメント(Oracleの表領域に相当):

セグメントは、1つ以上のデータベース・デバイスに指定される名前です。セグメント名は、CREATE TABLEおよびCREATE INDEX構文で使用され、これらのオブジェクトを特定のデータベース・デバイスに配置します。必要に応じてSP_EXTENDSEGMENTシステム・プロシージャを使用して、セグメントを拡張し、追加のデバイスを含めることができます。

次のセグメントは、データベースとともに作成されます。

  • システム・セグメント: システム表を格納します。

  • ログ・セグメント: トランザクション・ログを格納します。

  • デフォルト・セグメント: 特に指定がない場合、他のすべてのデータベース・オブジェクトがこのセグメントに格納されます。

セグメントは、データベース・デバイスのサブセットです。

表領域(Microsoft SQL ServerまたはSybase Adaptive Serverのセグメントに相当):

データベースは、表領域と呼ばれる論理記憶域の単位に分割されます。表領域は、関連する論理構造をまとめるために使用されます。通常、データベースには、1つのシステム表領域と1つ以上のユーザー表領域が存在します。

表領域エクステント:

エクステントは、同じ表領域内に存在する特定の数の連続したデータ・ブロックです。

表領域セグメント:

セグメントは、特定の論理データベース・オブジェクトに対して割り当てられるエクステントの集合です。1つのオブジェクトに対して割り当てられるすべてのセグメントは、同じ表領域に存在する必要があります。必要に応じて、セグメントは、セグメント自身に割り当てられるエクステントを取得します。

セグメントには、次の4つの異なる種類があります。

  • データ・セグメント: 各表に、1つのデータ・セグメントがあります。表のすべてのデータは、その表のデータ・セグメントのエクステントに格納されます。また、Oracleでは、表をクラスタとして格納できます。クラスタは、まとめて格納される複数の表の集合です。各クラスタに、1つのデータ・セグメントがあります。クラスタ内の各表のデータは、クラスタのデータ・セグメントに格納されます。


表領域セグメント(続き)

  • 索引セグメント: 各索引には、索引のすべてのデータを格納する索引セグメントがあります。

  • ロールバック・セグメント: UNDO情報を一時的に格納するために、データベースのDBAによって、1つ以上のロールバック・セグメントが作成されます。UNDO情報は、コミットされていないすべてのトランザクションの情報です。コミットされていないトランザクションをロールバックするデータベース・リカバリ時に、この情報を使用して、読取り一貫性のあるデータベース情報が生成されます。


  • 一時セグメント: SQL文の実行を完了するために、一時的な作業領域が必要な場合に、Oracleによって一時セグメントが作成されます。SQL文の実行終了時に、一時セグメントのエクステントは、将来の使用に備えてシステムに戻されます。

ログ・デバイス:

これは、論理デバイスで、ログを格納するために割り当てられます。ログを格納するデータベース・デバイスは、データベースの作成時に指定できます。

REDOログ・ファイル:

各データベースには、複数のREDOログ・ファイルがあります。データベースに対して実行されたすべての変更は、REDOログに記録されます。REDOログ・ファイルは、データベースを障害から保護するために重要です。Oracleでは、REDOログ・ファイルをミラー化して、これらのファイルの複数のコピーを保持できます。これによって、REDOログ・ファイルが格納されているハードウェア障害からログ・ファイルを保護します。

データベース・デバイス:

データベース・デバイスには、データベース・オブジェクトが含まれます。論理デバイスは、特定の物理デバイスまたはファイル・システムのファイルを参照するとはかぎりません。

データベースおよびログは、データベース・デバイスに格納されます。各データベース・デバイスは、データベース記憶域として使用する前に、初期化する必要があります。データベース・デバイスの初期化では、記憶域用のデバイスを初期化し、デバイスをサーバーに登録します。初期化が完了すると、このデバイスに対し次の処理を実行できます。

  • データベースで使用できる空き領域への割当て

  • 特定のユーザー・オブジェクトを格納するための割当て

  • データベースのトランザクション・ログの格納

  • データベース・オブジェクトを作成および変更するためのデフォルト・デバイスとしてのラベル付け

SP_HELPDEVICESシステム・プロシージャでは、サーバーに登録されているすべてのデバイスが表示されます。DROP DEVICE DEVICE_NAMEコマンドを使用すると、デバイスを削除できます。システム管理者(SA)は、デバイスの削除後に、サーバーを再起動する必要があります。

デバイスは、デフォルト・デイバスとしてラベル付けされているため、新しいデータベースの作成時に、デバイスを指定する必要ありません。SP_DISKDEFAULTシステム・プロシージャを使用して、デフォルト・デバイスとしてデバイスをラベル付けします。

なし

ダンプ・デバイス:

これは、論理デバイスです。データベースのダンプは、このデバイスに格納されます。DUMP DATABASEコマンドは、ダンプ・デバイスを使用して、データベースをダンプします。

なし

なし

制御ファイル:

各データベースに、1つの制御ファイルがあります。このファイルには、データベースの物理構造が記録されます。次の情報が含まれます。

  • データベース名

  • データベースのデータファイルおよびREDOログ・ファイルの名前および位置

  • データベース作成時のタイムスタンプ

制御ファイルは、ミラー化することができます。Oracle Databaseのインスタンスを起動するたびに、その制御ファイルが使用され、データベース、データの物理構造およびデータベース操作を進めるためにオープンする必要があるREDOログ・ファイルが識別されます。また、必要に応じて、制御ファイルはリカバリにも使用されます。制御ファイルには、Microsoft SQL ServerまたはSybase Adaptive Serverのマスター・データベースに類似した情報が格納されます。


推奨事項:

記憶域構造の概念の違いは、変換処理には直接影響しません。ただし、物理的な記憶域構造を準備してから、データベースの変換を開始する必要があります。

OracleおよびMicrosoft SQL ServerまたはSybase Adaptive Serverには、データベース・オブジェクトの物理的な配置を制御する方法があります。Microsoft SQL ServerまたはSybase Adaptive ServerではON SEGMENT句を使用し、OracleではTABLESPACE句を使用します。

Microsoft SQL ServerまたはSybase Adaptive ServerからOracleへの変換時には、可能なかぎり多くの記憶域情報を保持するようにします。Microsoft SQL ServerまたはSybase Adaptive Serverのデータベース・オブジェクトの記憶域を定義する際に決定した事項は、Oracleにも適用する必要があります。特に、オブジェクトの初期サイズおよび物理オブジェクトの配置は重要です。

2.4 データ操作言語

この項では、表を使用して、Microsoft SQL ServerまたはSybase Adaptive ServerデータベースとOracle Databaseのデータ操作言語(DML)要素の構文と内容を比較します。各表の後で、表の情報に基づく推奨事項を示します。この項では、次の項目について説明します。

2.4.1 データベースへの接続

表2-5に示す文は、ユーザーをデータベースに接続します。

表2-5 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverのデータベースへの接続

Microsoft SQL ServerまたはSybase Adaptive Server Oracle

構文:

USE database_name

構文:

 CONNECT user_name/password
 SET role

説明:

デフォルトのデータベースが各ユーザーに割り当てられます。ユーザーがサーバーにログインすると、このデータベースがカレントになります。他のデータベースに切り替えるには、USE DATABASE_NAMEコマンドを実行します。


推奨事項:

データベースへの接続についてのこの概念は、Microsoft SQL ServerまたはSybase Adaptive ServerデータベースとOracle Databaseで異なります。Microsoft SQL ServerまたはSybase Adaptive Serverのユーザーは、サーバーにログインして、サーバーに存在する他のデータベースに切り替えることができます。ただし、切り替えるデータベースのアクセス権を所有している必要があります。Oracleサーバーは、1つのデータベースのみを制御するため、ここでは、サーバー上のデータベースの切替えについては説明していません。かわりに、Oracleでは、SET ROLEコマンドを実行してロールを変更するか、別のuser_nameを使用してCONNECTコマンドを再発行します。

2.4.2 SELECT文

表2-6に示す文は、1つ以上の表またはビューから行を取得します。

表2-6 OracleとMicrosoft SQL ServerまたはSybase Adaptive ServerのSELECT文

Microsoft SQL ServerまたはSybase Adaptive Server Oracle

構文:

SELECT [ALL | DISTINCT] {select_list}
 [INTO [owner.]table]
 [FROM [owner.]{table | view}[alias] [HOLDLOCK]
 [,[owner.]{table | view }[alias]
 [HOLDLOCK]]...]
 [WHERE condition]
 [GROUP BY [ALL] aggregate_free_expression [, aggregate_free_expression]...]
 [HAVING search_condition]
 [UNION [ALL] SELECT...]
 [ORDER BY {[[owner.]{table | view }.]column | select_list_number | expression}
 [ASC | DESC]
 [,{[[owner.]{table | view }.]column | select_list_number | expression}
 [ASC | DESC]...]
 [COMPUTE row_aggregate(column) 
 [,row_aggregate(column)...]
 [BY column [, column...]]]
 [FOR BROWSE]
 The individual element in the select list is as follows:  
 [alias = ]
 {* | [owner.]{table | view}.* | SELECT ... | {[owner.]table.column | constant_literal | expression}
 [alias]}

構文:

SELECT [ALL | DISTINCT] {select_list}
FROM [user.]{table | view } [@dblink] [alias]
[, [user.] {table | view3} [@dblink] [alias]...
[WHERE condition]
[CONNECT BY condition [START WITH condition]]
[GROUP BY aggregate_free_expression
  [,aggregate_free_expression]...]
[HAVING search_condition]
[ {UNION [ALL] | INTERSECT | MINUS} SELECT ...]
[ORDER BY {expression | position} [ASC | DESC]...]
[FOR UPDATE [OF [[user.]{table | view}.]column
[,[[user.]{table | view}.]column... ]
[noWAIT] ]
The individual element in the select list is as follows:  
{ * | [owner.]{table | view | snapshot | synonym}.* | {[owner.]table.column | constant_literal | expression }
alias]}

説明:

DISTINCTは、重複する行を排除します。

INTO句およびコマンド構文でその句に続く項目はオプションです。Microsoft SQL ServerまたはSybase Adaptive ServerではFROM句なしでSELECT文を使用できるためです。次に例を示します。

SELECT getdate() 

SELECT...INTOを使用すると、SELECT文の結果を表に挿入できます。

SELECT_LISTには、列指定のかわりにSELECT文を含めることができます。次に例を示します。

SELECT d.empno, d.deptname, 
empname = (SELECT ename FROM emp
           WHERE enum = d.empno)
FROM dept d
WHERE deptid = 10

また、前述の例では、列別名の書式も示しています。

  ALIAS = selected_column

COMPUTEは、計算した結果を問合せの最後に加えます。この値は、row_aggregatesと呼ばれます。

GROUP BY句を使用する場合は、すべての非集計選択列が必要です。

参照モードにするには、FOR BROWSEキーワードを使用します。このモードでは、OLTP環境でデータを表示しながら更新が実行できる機能をサポートしています。DB-Libraryおよびホスト・プログラミング言語を使用するフロントエンドのアプリケーションで使用されます。データの整合性は、マルチ・ユーザー環境のTIMESTAMPフィールドを使用して維持されます。選択した行はロックされません。このため、トランザクションの実行中も同じ行を表示できます。選択した時間以降、行のTIMESTAMPが変更されていない場合、ユーザーは行を更新できます。

説明:

DISTINCTは、重複する行を排除します。

INSERT INTO <table> SELECT FROM....構文を使用すると、SELECT文の結果を表に挿入できます。

COLUMN ALIASは、選択したCOLUMNの後に別名を直接指定することで定義されます。

TABLE ALIASを使用する場合、TABLEは、常にALIASを使用して参照する必要があります。

また、SYNONYMSからデータを取得することもできます。

EXPRESSIONは、列名、リテラル、算術計算、ファンクション、複数のファンクションの組合せ、または複数の擬似列の1つにすることができます。

GROUP BY句を使用する場合は、すべての非集計選択列をGROUP BY句に指定する必要があります。

FOR UPDATE句を使用すると、問合せで選択された行をロックできます。ロックした行は、トランザクションが終了するまで、他のユーザーによるロックはできません。この句は、Microsoft SQL ServerまたはSybase Adaptive ServerのFOR BROWSEモードと完全に同じわけではありません。


2.4.2.1 FROM句を指定しないSELECT文:

Microsoft SQL ServerまたはSybase Adaptive Serverでは、FROM句を指定しないSELECT文がサポートされます。次に例を示します。

SELECT getdate()

Oracleでは、FROM句を指定しないSELECT文はサポートされません。ただし、Oracleでは、常に1行が格納されているDUAL表が提供されます。DUAL表を使用すると、前述のような問合せの構文を変換できます。

前述の問合せを次のように変換します。

SELECT sysdate FROM dual;

2.4.2.2 SELECT INTO文:

Microsoft SQL ServerまたはSybase Adaptive ServerのSELECT INTO文では、行を表に挿入できます。この構文は、SELECT部分とINSERT部分で構成され、ANSIではサポートされていません。Oracleでは、これらの文をINSERT...SELECT文に置き換えます。

次のようなMicrosoft SQL ServerまたはSybase Adaptive Serverの構文があるとします。

SELECT col1, col2, col3 
INTO target_table
FROM source_table
WHERE where_clause

Oracleでは、前述の構文を次のように変換する必要があります。

INSERT into target_table
SELECT col1, col2, col3
FROM source_table
WHERE where_clause

2.4.2.3 列別名:

列別名は、Microsoft SQL ServerまたはSybase Adaptive Serverの次のような構文から変換します。

SELECT employees=col1 FROM tab1e

Oracleの次のような構文に変換します。

SELECT col1 employees FROM tab1e

注意:

Microsoft SQL ServerまたはSybase Adaptive Serverでは、Oracle形式の列別名もサポートされます。

2.4.2.4 表の別名:

表の別名(相関名ともいう)がいずれの場所でも使用されていない場合に、その別名を削除します。

2.4.2.5 計算:

COMPUTE句を他のSELECTに置き換えます。UNION句を使用して、2つの結果を結合します。

2.4.3 GROUP BYが指定されたSELECT文

表2-7に、OracleのGROUP BYを指定したSELECT文とMicrosoft SQL ServerまたはSybase Adaptive Serverの同じ文との比較を示します。

表2-7 OracleとMicrosoft SQL ServerまたはSybase Adaptive ServerのGROUP BYを指定したSELECT文

Microsoft SQL ServerまたはSybase Adaptive Server/Server Oracle

構文:

SELECT文の項を参照してください。

構文:

SELECT文の項を参照してください。

説明:

GROUP BY句には、非集計選択列を指定する必要があります。

説明:

GROUP BY句には、すべての非集計選択列を指定する必要があります。


2.4.4 INSERT文

次の表に示す文は、1つ以上の行を表またはビューに追加します。

表2-8 OracleとMicrosoft SQL ServerまたはSybase Adaptive ServerのINSERT文

Microsoft SQL ServerまたはSybase Adaptive Server Oracle

構文:

 INSERT [INTO] [[database.]owner.] {table | view}[(column [, column]...)]{VALUES (expression [,expression]...) | query}

構文:

INSERT INTO [user.]{table | view}[@dblink][(column [, column]...)]{VALUES (expression [, expression]...) | query...};

説明:

INTOはオプションです。

いずれか1つの実表が変更されている場合にのみ、ビューへの挿入が可能になります。

説明:

INTOは必須です。

挿入は単一表ビューでのみ実行できます。


推奨事項:

Microsoft SQL ServerまたはSybase Adaptive Serverの元のINSERT文にINTO句が指定されていない場合は、INTO句が含まれるようにINSERT文を変更する必要があります。

いずれのデータベースでも、VALUES句で指定された値には、ファンクションが含まれます。Microsoft SQL ServerまたはSybase Adaptive Server固有のファンクションは、Oracleの同等の構文に置き換える必要があります。


注意:

Oracleでは、Microsoft SQL ServerまたはSybase Adaptive Serverのほとんどのファンクションに完全に一致するファンクションを作成できます。

Microsoft SQL ServerまたはSybase Adaptive Serverの複数表ビューへの挿入を変換して、Oracleの基礎となる表に直接挿入します。

2.4.5 UPDATE文

表2-9に示す文は、表のデータまたはビューによって参照される表のデータを更新します。

表2-9 OracleとMicrosoft SQL ServerまたはSybase Adaptive ServerのUPDATE文

Microsoft SQL ServerまたはSybase Adaptive Server Oracle

構文:

UPDATE [[database.]owner.] {table | view}
SET [[[database.]owner.] {table. | view.}]
column = expression | NULL | (select_statement)
[, column = expression | NULL | (select_statement)]...
[FROM [[database.]owner.]table | view
[, [[database.]owner.]table | view]...
[WHERE condition] 

構文:

UPDATE [user.]{table | view} [@dblink]
SET [[ user.] {table. | view.}]
{ column = expression | NULL | (select_statement) 
[, column = expression | NULL |
(select_statement)...] | 
(column [, column]...) = (select_statement)}
[WHERE {condition | CURRENT OF cursor}]

説明:

FROMを使用すると、1つ以上の表から更新する表にデータを取得したり、更新する行を検証できます。

複数表ビューを使用した更新では、基礎となる1つの表の列のみを変更できます。

説明:

単一の副問合せで、複数列をまとめて更新できます。この副問合せでは、SET句の列のリストで使用されている数と同じ数の(互換性のあるデータ型を持つ)列を選択する必要があります。

CURRENT OF cursor句を使用すると、UPDATE文は、その時点で最後に実行したFETCH結果としてカーソルに存在する単一行のみに影響します。カーソルのSELECT文は、FOR UPDATE句に含まれている必要があります。

更新は単一表ビューでのみ実行できます。


推奨事項:

FROM句を指定したUPDATE文を変換するには、次の項に説明する2つの方法があります。

2.4.5.1 方法1 - FROM句を使用したUPDATE文の変換:

列が別の表からの値に更新されている場合は、SET句に副問合せを使用します。

次のようなMicrosoft SQL ServerまたはSybase Adaptive Serverの例を変換します。

update titles
SET pub_id = publishers.pub_id
FROM titles, publishers
WHERE titles.title LIKE 'C%' 
AND publishers.pub_name = 'new age'

次のようなOracleの問合せに変換します。

MERGE INTO titles
USING (SELECT * FROM publishers) publishers
ON ( titles.title LIKE 'C%'
  AND publishers.pub_name = 'new age' )
WHEN MATCHED THEN UPDATE SET pub_id = publishers.pub_id;

2.4.5.2 方法2 - FROM句を使用したUPDATE文の変換:

他のすべてのUPDATE...FROM文のWHERE句に副問合せを使用します。

次のようなMicrosoft SQL ServerまたはSybase Adaptive Serverの例を変換します。

UPDATE shipping_parts
SET qty = 0
FROM shipping_parts sp, suppliers s
WHERE sp.supplier_num = s.supplier_num
  AND s.location = "USA"

次のようなOracleの問合せに変換します。

MERGE INTO shipping_parts sp
USING (SELECT * FROM suppliers) S
ON ( sp.supplier_num = S.supplier_num
  AND S.location = 'USA' )
WHEN MATCHED THEN UPDATE SET qty = 0;

2.4.6 DELETE文

表2-10に示す文は、表から行を削除し、ビューで参照されている表から行を削除します。

表2-10 OracleとMicrosoft SQL ServerまたはSybase Adaptive ServerのDELETE文

Microsoft SQL ServerまたはSybase Adaptive Server Oracle

構文:

DELETE [FROM] [[database.]owner.]{table | view}
[FROM [[database.]owner.]{table | view}
[, [[database.]owner.]{table | view}]...]
[WHERE where_clause]

構文:

DELETE [FROM] [user.]{table | view} [@dblink]
[alias]

[WHERE where_clause]

説明:

DELETE FROMの最初のFROMはオプションです。

2つ目のFROM句はMicrosoft SQL ServerまたはSybase Adaptive Serverの拡張機能です。この拡張機能を使用すると、ユーザーは別の表のデータに基づいて削除を行うことができます。WHERE句の副問合せも同じ用途で使用されます。

削除は単一表ビューを介してのみ実行できます。

説明:

FROMはオプションです。

ALIASは相関名として表名に指定でき、条件で使用できます。

削除は単一表ビューを介してのみ実行できます。


2.4.6.1 2つ目のFROM句の削除:

DELETE文から2つ目のFROM句を削除します。

次のようなMicrosoft SQL ServerまたはSybase Adaptive Serverの問合せを変換します。

DELETE 
FROM sales
FROM sales, titles
WHERE sales.title_id = titles.title_id 
AND titles.type = 'business'

次のようなOracleの問合せに変換します。

DELETE sales
WHERE ROWID IN
( SELECT sales.ROWID
  FROM sales, titles
   WHERE sales.title_id = titles.title_id
           AND titles.TYPE = 'business' );

WHEREに複数列のJOINが含まれる場合でも2つ目のFROMを削除します。

次のようなMicrosoft SQL ServerまたはSybase Adaptive Serverの問合せを変換します。

DELETE 
FROM sales
FROM sales, table_x
WHERE sales.a = table_x.a
   AND sales.b = table_x.b
   AND table_x.c = 'd'

次のようなOracleの問合せに変換します。

DELETE sales
WHERE ROWID IN
( SELECT sales .ROWID
  FROM sales ,
       table_x
   WHERE sales.a = table_x.a
           AND sales.b = table_x.b
           AND table_x.c = 'd' );

2.4.7 演算子

この項では、Microsoft SQL ServerまたはSybase Adaptive ServerデータベースとOracle Databaseで使用される様々な演算子を比較します。内容は次のとおりです。

2.4.7.1 比較演算子

表2-11では、Microsoft SQL ServerデータベースとOracle Databaseで使用される演算子を比較します。比較演算子は、値を比較するためにWHERE句およびCOLUMNのチェック制約または規則で使用されます。

表2-11 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverの比較演算子

演算子 両方のデータベースで共通 Microsoft SQL ServerまたはSybase Adaptive Serverのみ Oracleのみ

等しい

=



等しくない

!=

<>


^=

未満

<

より大きい

>



以下

<=

!>

以上

>=

!<

x以上およびy以下

BETWEEN x AND y



x未満またはyより大きい

NOT BETWEEN x AND y



パターン一致

aの後に0文字以上が続く

aの後に1文字のみが続く

aの後にxからzの任意の文字が続く

aの後にxからz以外の任意の文字が続く

aの後に%が続く

LIKE 'a%'

LIKE 'a_'

LIKE'a[x-z]'

LIKE'a[^x-z]'

LIKE 'a\%'

ESCAPE '\'

パターン不一致

NOT LIKE



値が存在しない

IS NULL



値が存在する

IS NOT NULL



問合せで1行以上戻される

EXISTS (query)



問合せで行が戻されない

NOT EXISTS (query)



メンバーと等しい

IN =ANY


= SOME

メンバーと等しくない

NOT IN != ANY <> ANY


!= SOME <> SOME

メンバー未満

< ANY


< SOME

メンバーより大きい

> ANY


> SOME

メンバー以下

<= ANY

!> ANY

<= SOME

メンバー以上

>= ANY

!< ANY

>= SOME

すべてのメンバーと等しい

=ALL



すべてのメンバーと等しくない

!= ALL <> ALL



すべてのメンバー未満

< ALL



すべてのメンバーより大きい

> ALL



すべてのメンバー以下

<= ALL

!> ALL


すべてのメンバー以上

>= ALL

!< ALL



推奨事項:

  1. すべての!<と!>を>=と<=に変換します。

    次のようなMicrosoft SQL ServerまたはSybase Adaptive Serverの例を変換します。

    WHERE col1 !< 100
    

    次のようなOracleの構文に変換します。

    WHERE col1 >= 100
    

  1. [ ]と[^]を使用したlike比較演算子を変換します。

    SELECT title
    FROM titles
    WHERE title like "[A-F]%"
    

  1. NULL構文を変更します。

    表2-12に示すとおり、OracleではNULLはNULLと同じではありません。同様の機能を保持するために、すべての= NULL構文をIS NULLに変更します。

表2-12 NULL構文の変更

NULL構文 Microsoft SQL ServerまたはSybase Adaptive Server Oracle
where col1 = NULL
depends on the data
FALSE
where col1 != NULL
depends on the data
TRUE
where col1 IS NULL
depends on the data
depends on the data 
where col1 IS NOT NULL
depends on the data
depends on the data 
where NULL = NULL
TRUE
 FALSE

次のようなMicrosoft SQL ServerまたはSybase Adaptive Serverの例を変換します。

WHERE col1 = NULL

次のようなOracleの構文に変換します。

WHERE col1 IS NULL

2.4.7.2 算術演算子

表2-13 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverの算術演算子

演算子 両方のデータベースで共通 Microsoft SQL ServerまたはSybase Adaptive Serverのみ Oracleのみ

加算

+




減算

-



乗算

*



除算

/



Modulo

v

%


mod(x, y)


推奨事項:

Microsoft SQL ServerまたはSybase Adaptive ServerのModuloファンクションを、Oracleのmod()ファンクションに置き換えます。

2.4.7.3 文字列演算子

表2-14 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverの文字列演算子

演算子 両方のデータベースで共通 Microsoft SQL ServerまたはSybase Adaptive Serverのみ Oracleのみ

連結

s

+

||


リテラルの指定

'文字列'

"文字列"


推奨事項:

すべての追加文字列を||構文に置き換えます。

すべての二重引用符の文字列識別子を一重引用符の識別子に置き換えます。

Microsoft SQL ServerまたはSybase Adaptive Serverでは、空の文字列('')はINSERT内の単一の空白またはVARCHARデータへの割当て文として解釈されます。VARCHAR、CHARまたはTEXTデータの連結では、空の文字列は単一の空白と解釈されます。空の文字列はNULLとして解釈されません。アプリケーションを変換する場合は、この点について注意する必要があります。

2.4.7.4 集合演算子

表2-15 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverの集合演算子

演算子 両方のデータベースで共通 Microsoft SQL ServerまたはSybase Adaptive Serverのみ Oracleのみ

いずれかの問合せの重複していない行

UNION



両方の問合せのすべての行

UNION ALL



両方の問合せの重複していないすべての行

d

INTERSECT

1つ目の問合せ(2つ目の問合せは除く)の重複していないすべての行

d

MINUS


2.4.7.5 ビット演算子

表2-16 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverのビット演算子

演算子 両方のデータベースで共通 Microsoft SQL ServerまたはSybase Adaptive Serverのみ Oracleのみ

論理積


&



論理和


|



排他的論理和


^


否定


~



推奨事項:

Oracleでは、ビット単位の操作を実行するためのプロシージャを作成することはできます。

次のようなMicrosoft SQL ServerまたはSybase Adaptive Server構文の例を変換します。

X | Y :(Bitwise OR)

dbms_bits.or (x,y)というプロシージャを作成し、前述の構文を次のようなOracleの構文に変換します。

dbms_bits.or(x,y)

2.4.8 組込みファンクション

この項では、Microsoft SQL ServerまたはSybase Adaptive ServerデータベースとOracle Databaseで使用される様々なファンクションを比較します。内容は次のとおりです。

2.4.8.1 文字ファンクション

表2-17 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverの文字ファンクション

Microsoft SQL ServerまたはSybase Adaptive Server Oracle 説明

ascii(char)

ascii(char)

文字と同等のASCIIを返します。

char(integer_expression)

chr(integer_expression)

ASCII文字の10進コードを対応する文字に変換します。

charindex(specified_exp, char_string)

instr(specified_exp, char_string, 1, 1)

char_stringでspecified_expが最初に出現する位置を返します。

convert(data type, expression, [format])

to_char、to_number、to_date、to_label、chartorowid、rowtochar、hextochar、chartohex

オプションの書式を使用して、あるデータ型を別のデータ型に変換します。機能の大部分を一致させることができます。詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

datalength(expression)

g

式に割り当てられた長さを計算し、結果をバイト単位で返します。

difference(character_exp, character_exp)

d

2つの文字列のSOUNDEX値の数値の差異を返します。

isnull(variable, new_value)

nvl(variable, new_value)

変数値がNULLの場合に、new_valueを返します。

lower(char_exp)

lower(char_exp)

大文字を小文字に変換します。

ltrim(char_exp)

ltrim(char_exp)

char_expの左端の後続空白を切り捨てます。

patindex(pattern, column_name)

instr(column_name, pattern)

列値内のパターンの位置を返します。パターンにはワイルド・カードを含めることができます。このファンクションは、TEXTおよびBINARYデータ型でも機能します。

replicate(char_exp, n)

rpad(char_exp, length(char_exp)*n, '')

char_expがn回繰り返される文字列を作成します。

reverse(char_string)


指定したchar_stringを反転させます。

right(char_exp, n)

substr(char_exp, (length(char_exp)

文字列のうち、nで指定した位置から繰り上がって、文字列の左端までの部分を返します。

rtrim(char_exp)

rtrim(char_exp)

char_expの右端の後続空白を切り捨てます。

soundex(exp)

soundex(exp)

指定された式と発音が類似している式を返します。

space(int_exp)

rpad(' ', int_exp-1, '')

int_expの空白を持つ文字列を生成します。

str(float_exp, length)

to_char(float_exp)stuff(char_exp, start, length, replace_str)substr(char_exp, 1, start) ||replace_str ||substr(char_exp, start+length)

char_exp内のサブストリングをreplace_strに置き換えます。

substring(char_exp, start, length)

IMAGEおよびTEXTデータ型で機能します。

substring(char_exp, start, length)

LONGおよびLONG_RAWデータ型では機能しません。

char_exp内のサブストリングをreplace_strに置き換えます。

textptr(column_name)

d

名前付きのIMAGEまたはTEXT列のポインタをvarbinary(16)データ型として返します。

textvalid("column_name", text_pointer)

h

指定されたcolumn_nameに対して、text_pointerが有効な場合に1を返します。列はTEXTまたはIMAGE型である必要があります。

upper(char_exp)

upper(char_exp)

小文字を大文字に変換します。


2.4.8.2 その他のファンクション

表2-18 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverの比較演算子

Microsoft SQL ServerまたはSybase Adaptive Server Oracle 説明

datalength(expression)

lengthb

式に割り当てられた長さを計算し、結果をバイト単位で返します。

isnull(variable, new_value)

nvl(variable, new_value)

変数値がNULLの場合に、new_valueを返します。



注意:

前述のファンクションの表には、Microsoft SQL ServerまたはSybase Adaptive Serverのすべての文字操作ファンクションが示されています。ただし、Oracleのファンクションについてはすべてを示していません。Oracleには、この他にも多くの文字操作ファンクションがあります。

2.4.8.2.1 Oracleでのファンクションの定義:

Oracleにはファンクションを定義する機能が追加されています。この機能を使用すると、Microsoft SQL ServerまたはSybase Adaptive Serverのファンクションの名前および機能と一致するOracleのファンクションを作成できます。

2.4.8.3 日付ファンクション

表2-19 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverの日付ファンクション

Microsoft SQL ServerまたはSybase Adaptive Server Oracle 説明
dateadd(dd, int_exp,datetime_var)
date+int_exp
requires conversion of int_exp to a number of days

int_expの日数をdatetime_varに含まれている日付に追加します。

dateadd(mm, int_exp,datetime_var)
add_months(date, int_exp)
or 
date+int_exp requires conversion of int_exp to a number of days

int_expの月数をdatetime_varに含まれている日付に追加します。

dateadd(yy, int_exp,datetime_var)
date+int_exp 
requires conversion of int_exp to a number of days

int_expの年数をdatetime_varに含まれている日付に追加します。

datediff(dd, datetime1,datetime2)
date2-date1

datetime1およびdatetime2変数に指定された日付の差異を返します。この差異は日数で計算されます。

datediff(mm, datetime1,datetime2)
months_between               (date2, date1)

datetime1およびdatetime2変数に指定された日付の差異を返します。この差異は月数で計算されます。

datediff(yy, datetime1,datetime2)
(date2-date1) /365.254

datetime1およびdatetime2変数に指定された日付の差異を返します。この差異は年数で計算されます。

datename (datepart, date)
to_char(date, format)

指定された日付の一部を整数として返します。Microsoft SQL ServerまたはSybase Adaptive ServerのDATETIMEは、OracleのDATEより高い精度を持ちます。このため、Microsoft SQL ServerまたはSybase Adaptive Serverのdatepartと一致するOracleの同等の書式の文字列を検出できない場合があります。DATETIMEデータ型の変換の詳細は、この章の「データ型」の項を参照してください。

datepart(datepart, date)
to_char(date, format)

指定された日付の一部を文字列(名前)として返します。Microsoft SQL ServerまたはSybase Adaptive ServerのDATETIMEは、OracleのDATEより高い精度を持ちます。このため、Microsoft SQL ServerまたはSybase Adaptive Serverのdatepartと一致するOracleの同等の書式の文字列を検出できない場合があります。

getdate()
sysdate

システム日付を返します。


推奨事項:

前述の表には、Microsoft SQL ServerまたはSybase Adaptive Serverのすべての日付操作ファンクションが示されています。ただし、Oracleのファンクションについてはすべてを示していません。Oracleには、この他にも多くの日付操作ファンクションがあります。

Oracleでは、ほとんどの日付操作ファンクションを「+」または「-」に変換することをお薦めします。

Oracleにはファンクションを定義する機能が追加されています。この機能を使用すると、Microsoft SQL ServerまたはSybase Adaptive Serverのファンクションの名前および機能と一致するOracleのファンクションを作成できます。SQL文のSELECT LIST句、WHERE句、ORDER BY句およびHAVING句からPL/SQLファンクションをコールできるため、この機能を使用することをお薦めします。パラレル問合せオプションを使用すると、OracleはPL/SQLファンクションをSQL文とパラレルに実行します。したがって、ユーザーはパラレル・ロジックを作成します。

2.4.8.4 算術ファンクション

表2-20 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverの算術ファンクション

Microsoft SQL ServerまたはSybase Adaptive Server Oracle

abs(n)

abs(n)

acos(n)

acos(n)

asin(n)


atan(n)

atan(n)

atn2(n,m)


ceiling(n)

ceil(n)

cos(n)

cos(n)

cot(n)


degrees(n)


exp(n)

exp(n)

floor(n)

floor(n)

log(n)

ln(n)

log10(n)

log(base,number)

pi()


power(m,n)

power(m,n)

radians(n)


rand(n)


round(n[,m])

round(n[,m])

sign(n)

sign(n)

sin(n)

sin(n)

sqrt(n)

sqrt(n)

tan(n)

tan(n)


推奨事項:

前述の表には、Microsoft SQL ServerまたはSybase Adaptive Serverのすべての数値操作ファンクションが示されています。ただし、Oracleのファンクションについては、すべてを示していません。Oracleには、この他にも多くの数値操作ファンクションがあります。

Oracleにはファンクションを定義する機能が追加されています。この機能を使用すると、Microsoft SQL ServerまたはSybase Adaptive Serverのファンクションの名前および機能と一致するOracleのファンクションを作成できます。これは最も柔軟な方法です。ユーザーは独自のファンクションを作成し、これらをSQL文から透過的に実行できます。

表に示すOracleのファンクションは、SQLおよびPL/SQLで機能します。

2.4.9 ロックの概念およびデータ同時実行性の問題

この項では、Microsoft SQL ServerまたはSybase Adaptive ServerデータベースとOracle Databaseのロックおよびトランザクション処理を比較します。内容は次のとおりです。

2.4.9.1 ロック

ロックは同時実行性の制御メカニズムとして機能します。複数ユーザー環境では、一度に複数のユーザーが同一のデータを処理する場合があるためロックが必要です。

表2-21 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverのロック

Microsoft SQL ServerまたはSybase Adaptive Server Oracle

Microsoft SQL ServerまたはSybase Adaptive Serverのロックは完全に自動で、手動での操作は不要です。

Microsoft SQL ServerまたはSybase Adaptive Serverでは、INSERT、UPDATEおよびDELETE操作に対して排他ロックが適用されます。排他ロックが設定されている場合、他のトランザクションは、元のロックが設定されるまでそのオブジェクト上のすべての種類のロックを取得できません。

更新しない操作または読取り操作の場合、共有ロックが適用されます。共有ロックが表またはページに適用される場合、他のトランザクションはその表またはページ上の共有ロックを取得できます。ただし、いずれのトランザクションも排他ロックは取得できません。そのため、Microsoft SQL ServerまたはSybase Adaptive Serverの読取りではデータに対する変更がブロックされます。

更新ロック:

更新ロックはページ・レベルで保持されます。更新ロックは、ページの読取り中に更新操作の初期段階で設定されます。更新ロックは共有ロックとあわせて設定できます。ページが後で変更された場合、更新ロックは排他ロックになります。

Oracleのロックは完全に自動で、手動での操作は不要です。次のロックがOracleの特徴です。

データ・ロック(DMLロック)は、データを保護します。表ロックは表全体を、行ロックは各行をロックします。

ディクショナリ・ロック(DDLロック)は、オブジェクト構造を保護します。

内部ロックは、ファイルなどの内部構造を保護します。

DML操作では2つの異なるレベル(指定した行または表全体に対して)でデータ・ロックを取得できます。

行レベル・ロック:

排他ロックは、行がDML文によって変更される場合にトランザクションの対象の各行に対して取得されます。トランザクションが行レベル・ロックを取得する場合、対応する表に対する表(ディクショナリ・)ロックも取得します。これによって、実行中のトランザクションでデータ変更を上書きする可能性があるDDL(DROP TABLE、ALTER TABLE)操作の競合を回避できます。

意図的ロック:

Microsoft SQL ServerまたはSybase Adaptive Serverのロックは完全に自動で、手動での操作は不要です。Microsoft SQL ServerまたはSybase Adaptive Serverでは、INSERT、UPDATEおよびDELETE操作に対して排他ロックが適用されます。排他ロックが設定されている場合、他のトランザクションは、元のロックが設定されるまでそのオブジェクト上のすべての種類のロックを取得できません。更新しない操作または読取り操作の場合、共有ロックが適用されます。共有ロックが表またはページに適用される場合、他のトランザクションはその表またはページ上の共有ロックを取得できます。ただし、いずれのトランザクションも排他ロックは取得できません。そのため、Microsoft SQL ServerまたはSybase Adaptive Serverの読取りではデータに対する変更がブロックされます。

エクステント・ロック:

エクステント・ロックは、8ページのデータベース・ページの割当てまたは解放が行われる場合にこれらのページのグループをロックします。これらのロックは、CREATEまたはDROP文の実行中、または新しいデータまたは索引ページを要求するINSERT文の実行中に保持されます。

現行のサーバーのアクティブなロックのリストは、SP_LOCKシステム・プロシージャを参照してください。

表レベル・データ・ロックは次のいずれかのモードで保持できます。

行共有表ロック(RW):

これは、表上のロックを保持しているトランザクションは表の行をロックし、それらを更新しようとしていることを示します。これによって、他のトランザクションがLOCK TABLE表のIN EXCLUSIVE MODE文を使用して、同一の表への排他的書込み権限を取得することが回避されます。これ以外については、その表で、すべての問合せ、挿入、削除および更新が可能です。

行排他表ロック(RX):

通常、これはロックを保持しているトランザクションがその表の行に対して1回以上の更新を行ったことを示します。その表で、問合せ、挿入、削除および更新が可能です。

共有ロック(SL)

共有行排他ロック(SRX)

排他ロック(X)

動的パフォーマンス表V$LOCKがロックに関する情報を保持します。


推奨事項:

Microsoft SQL ServerまたはSybase Adaptive Serverでは、SELECT文はページまたは行(あるいはその両方)の共有ロックを取得します。これによって、他の文がそれらのページまたは行(あるいはその両方)の排他ロックを取得することを回避できます。データを更新するすべての文では排他ロックが必要です。これは、Microsoft SQL ServerまたはSybase Adaptive ServerのSELECT文は、SELECT文を含むトランザクションがコミットまたはロールバックを実行しないかぎりUPDATE文をブロックすることを意味します。また、これは2つのトランザクションで、一方のトランザクションがデータを選択し、もう一方のトランザクションがデータを変更してからデータを再選択する場合、これらのトランザクションが物理的にシリアライズされることも意味します。ただし、Oracleでは、ロールバック・セグメントは変更されたデータが実際の表で更新される前に、このデータを格納するために使用されるため、SELECT文はUPDATE文をブロックしません。また、Oracleではデータ・リーダーもブロックされません。これによって、Oracleではトランザクションを同時に実行できます。

Microsoft SQL ServerまたはSybase Adaptive Serverの論理トランザクションがOracleの論理トランザクションに自動的に変換される場合、それらのトランザクションがシリアライズされる際にMicrosoft SQL ServerまたはSybase Adaptive Serverで適切に実行される変換前のトランザクションによって、Oracleでデッドロックが発生します。デッドロックを回避するために、これらのトランザクションを識別およびシリアライズする必要があります。Microsoft SQL ServerまたはSybase Adaptive Serverでは、これらのトランザクションはINSERT、UPDATEおよびDELETE文がその他の文をブロックする場合にシリアライズされます。

2.4.9.2 行レベル・ロックとページ・レベル・ロック

表2-22 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverの行レベル・ロックとページ・レベル・ロック

Microsoft SQL ServerまたはSybase Adaptive Server Oracle

Microsoft SQL ServerまたはSybase Adaptive Serverには、行レベル・ロック機能はありません。

Microsoft SQL ServerまたはSybase Adaptive Serverでは、ページ・レベル・ロックが適用されます。このロックは、ページ内のいずれかの行の更新中は、常にページ上のすべての行を事実上ロックします。このロックでは、DML文によるデータの変更中は、常に排他ロックとなります。

Microsoft SQL Server 7.0では、行レベル・ロック形式が実装されます。

Microsoft SQL Server 7.0では、自動的にロックが行レベルからページ・レベルになります。

SELECT文は、ページ全体をロックする排他ロックによってブロックされます。

Oracleには、行ロック機能があります。DML文による行の変更中は、その1行のみがロックされます。


推奨事項:

Oracleの行レベル・ロック機能を使用するための変更は必要ありません。

2.4.9.3 読取り一貫性

表2-23 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverの読取り一貫性

Microsoft SQL ServerまたはSybase Adaptive Server Oracle

Microsoft SQL ServerまたはSybase Adaptive Serverは、トランザクション・レベルの読取り一貫性にHOLDLOCK機能を提供します。HOLDLOCKを使用してSELECTを指定すると、データに対し共有ロックがかかります。複数のユーザーが互いにブロックすることなく、同時にHOLDLOCKを使用したSELECTを実行できます。

選択されているデータを、ユーザーの1人が更新しようとした場合は、HOLDLOCKによって、他のユーザーが更新をコミットまたはロールバックするまで、または更新を試行してデッドロックが発生するまで、その更新がブロックされます。つまり、HOLDLOCKは、現行のトランザクションが有効になるまで、他のトランザクションによる同じデータの更新を防ぎます。

Oracleでサポートする読取り一貫性では、次の内容が保証されます。

  • 文によって参照されるデータ・セットが、単一のある時点で一貫性があり、文の実行中は変更されない。

  • データベースのデータの読取りは、同じデータの他の読取りまたは書込みを待機しない。

  • データベースのデータの書込みは、同じデータの読取りを待機しない。

  • 書込みは、同時に発生したトランザクションでの同じ行の更新を試行する場合のみ、他の書込みを待機する。

読取り一貫性を提供するために、Oracleでは、表が読み取られ、同時に更新される場合に、読取り一貫性のあるデータ・セットが作成されます。

読取り一貫性機能は、次のとおりです。

  1. 更新が発生した場合、更新によって変更される元のデータ値は、ロールバック・セグメントに記録されます。

  2. 更新のトランザクションがすべてコミットされるまでは、その変更済のデータに対して読取りを実行するユーザーには、元のデータ値が表示されます。他のユーザーのトランザクションがコミットされてから開始する文のみが、そのトランザクションによる変更を反映します。

次のコマンドを使用して、トランザクションを読取り専用に指定できます。

SET TRANSACTION READ ONLY

2.4.9.4 論理トランザクション処理

表2-24 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverの論理トランザクション処理

Microsoft SQL ServerまたはSybase Adaptive Server Oracle

処理の完了後、トランザクションにないすべての文は自動的にコミットされます。複数のT-SQL文を一度にサーバーに送信するように、文をバッチ化できます。データベースへの変更は、バッチの実行後に、自動的にコミットされます。その後に実行されるROLLBACK TRAN文は、無効となります。Microsoft SQL ServerまたはSybase Adaptive Serverでは、トランザクションは暗黙的ではありません。BEGIN TRANSACTION句を使用して、論理トランザクションを開始します。論理トランザクションは、次のようにコミットまたはロールバックできます。

BEGIN TRANSACTION [transaction_name]

COMMIT TRANを使用して、データベースに対しトランザクションをコミットします。トランザクション名を指定することもできます。ROLLBACK TRANを使用して、トランザクションをロールバックします。次のコマンドを使用して、セーブポイントを設定すると、論理トランザクション内の特定のポイントまでロールバックできます。

  SAVE TRANSACTION savepoint_name

次のコマンドを使用すると、指定したセーブポイントまでロールバックできます。

ROLLBACK TRAN <savepoint_name>

文は、自動的にデータベースにコミットされます。データベースに対し保留状態にある変更をコミットするには、COMMIT WORK文を実行する必要があります。

Oracleでは、トランザクションは暗黙的です。つまり、データベース内のデータ変更の直後に、論理トランザクションが開始します。

COMMIT WORKは、データベースに対し保留状態にある変更をコミットします。

ROLLBACKは、最後にCOMMIT WORK文を実行した後のすべてのトランザクションを取り消します。

次のコマンドを使用して、トランザクションにセーブポイントを設定できます。

  SET SAVEPOINT savepoint_name

次のコマンドを使用すると、指定したセーブポイントまでロールバックします。

  ROLLBACK <savepoint_name>

Oracleでは、2フェーズ・コミットは自動的で透過的です。2フェーズ・コミット操作は、複数のデータベースのデータを変更するトランザクションに対してのみ必要です。

Microsoft SQL ServerまたはSybase Adaptive Serverでは、BEGIN TRAN文およびCOMMIT TRAN文をネストできます。ネストした場合は、最も外側のトランザクションの組が、トランザクションを作成しコミットします。内側の組は、ネスト・レベルを保持します。ネストしたトランザクションのROLLBACKコマンドは、セーブポイント名が含まれていない場合、最も外側のBEGIN TRANレベルまでロールバックします。Microsoft SQL ServerまたはSybase Adaptive Serverのほとんどのアプリケーションでは、単一サーバー上でも2フェーズ・コミットが必要です。サーバーがトランザクションをコミットできる状態にあるかどうかを確認するには、2フェーズ・コミット・アプリケーションでPREPARE TRANを使用します。

完了済のトランザクションは、チェックポイントでデータベース・デバイスに書き込まれます。チェックポイントでは、最後のチェックポイントからのすべての使用済ページがディスク・デバイスに書き込まれます。

リモート・プロシージャへのコールは、そのプロシージャが含まれているトランザクションとは別に実行されます。

チェックポイントが発生した場合、完了済のトランザクションはデータベース・デバイスに書き込まれます。チェックポイントでは、最後のチェックポイント後に変更されたすべての使用済ページがディスク・デバイスに書き込まれます。


推奨事項:

Microsoft SQL ServerまたはSybase Adaptive Serverでは、トランザクションは暗黙的ではありません。したがって、アプリケーションによって発行されるすべての文は、実行されるたびに自動的にコミットされることが想定されています。

通常、Oracleのトランザクションは暗黙的です。つまり、個々の文が自動的にコミットされることはありません。Microsoft SQL ServerまたはSybase Adaptive ServerのアプリケーションをOracleのアプリケーションに変換する場合、そのアプリケーションでトランザクションを構成しているものを判別するには注意が必要です。通常、文のバッチ、単一の文またはストアド・プロシージャ・コールを実行するたびにCOMMIT処理文を発行し、そのアプリケーションでのMicrosoft SQL ServerまたはSybase Adaptive Serverの動作をレプリケートする必要があります。

また、Microsoft SQL ServerまたはSybase Adaptive Serverでは、変換処理中にBEGIN TRAN文を発行して、クライアント・アプリケーションから明示的にトランザクションを開始することもできます。