| Oracle® SQL Developer Microsoft SQL ServerおよびSybase Adaptive Serverからの移行のための追加情報 リリース3.0 B66848-01 |
|
![]() 前 |
![]() 次 |
この章では、Microsoft SQL ServerまたはSybase Adaptive ServerデータベースとOracleデータベースの違いについて説明します。内容は次のとおりです。
スキーマには、表、ビュー、索引、ユーザー、制約、ストアド・プロシージャ、トリガーおよびデータベース固有のその他のオブジェクトの定義が含まれています。ほとんどのリレーショナル・データベースは、類似したオブジェクトとともに動作します。
この項では、次の項目について説明します。
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トリガー |
複合ルール |
|
各行に対するトリガー |
なし |
|
シノニム |
なし |
|
順序 |
列に対する識別プロパティ |
|
スナップショット |
なし |
|
ビュー |
ビュー |
予約語は、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言語リファレンス』を参照してください。
この項では、Microsoft SQL ServerまたはSybase Adaptive ServerデータベースをOracleに変換する際に考慮が必要な、表の設計上の多くの問題について説明します。次の項目について説明します。
ここでは、次のデータ型の変換時における考慮事項について説明します。
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秒です。ただし、記録される精度は、オペレーティング・システムによって異なります。
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データのこのサイズは、ほとんどのアプリケーションに適しています。
Microsoft SQL ServerまたはSybase Adaptive ServerのSQLに対するT-SQL固有のこの拡張機能を使用すると、ユーザー固有のデータ型を定義および名前付けして、システム・データ型を補うことができます。ユーザー定義データ型は、データベースのいずれの列のデータ型として使用できます。デフォルトおよびルール(チェック制約)は、これらのユーザー定義データ型にバインドすることができ、これらのユーザー定義データ型の個々の列に自動的に適用されます。
Oracle PL/SQLへの移行時に、SQL Developerは各ユーザー定義データ型に対するベース・データ型を決定し、同等のPL/SQLデータ型を検出します。
|
注意: ユーザー定義データ型を使用すると、異なるデータベース・サーバー間でのデータ定義言語コードおよび手続き型SQLコードの移植性が低くなります。 |
Microsoft SQL ServerまたはSybase Adaptive Serverでは、表に対して主キーを定義できます。主キーは、CREATE TABLE文またはALTER TABLE文で定義できます。
Oracleでは、宣言的な参照整合性が提供されます。主キーは、CREATE TABLE文またはALTER TABLE文の一部として定義できます。Oracleでは、整合性を向上させるために、内部的に一意索引が作成されます。
Microsoft SQL ServerまたはSybase Adaptive Serverでは、表に対して外部キーを定義できます。外部キーは、CREATE TABLE文またはALTER TABLE文で定義できます。
Oracleでは、宣言的な参照整合性が提供されます。CREATE TABLE文またはALTER TABLE文を使用すると、外部キーを表定義に追加できます。参照整合性制約については、『Oracle Database概要』を参照してください。
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でマッピングされます。
Microsoft SQL ServerまたはSybase Adaptive Serverでは、チェック制約をCREATE TABLE文またはALTER TABLE文で定義できます。1つの表に複数のチェック制約を定義できます。表レベルのチェック制約は、制約付き表のいずれの列も参照できます。1つの列に設定できるのは、1つのチェック制約のみです。列レベルのチェック制約は、制約付き列のみを参照できます。これらのチェック制約は、複雑な正規表現をサポートします。
Oracleでは、チェック制約をCREATE TABLE文またはALTER TABLE文の一部として定義します。チェック制約は、列レベルではなく、表レベルで定義されます。したがって、チェック制約は、表のいずれの列も参照できます。ただし、Oracleでは、複雑な正規表現をサポートしていません。
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トリガーを記述して同じ機能を実現するようにできます。
この項では、Microsoft SQL ServerまたはSybase Adaptive ServerデータベースとOracle Databaseで使用するデータ型の違いについて説明します。この項の内容は、次のとおりです。
Microsoft SQL ServerまたはSybase Adaptive Serverで使用可能なベース・データ型、およびそのデータ型とOracleのデータ型のマッピングを示す表
表に示す情報に基づく推奨事項
表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を乗算して、自然数に切り上げます。 |
|
浮動小数点数。この列の精度は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ファンクションによって、それらのビットに対して設定、設定解除、取得、問合せを実行できます。 |
|
常に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に変換されます。 |
|
|
可変長文字列。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 |
|
|
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は、VARBINARY(8)で定義されNULLが許可されます。TIMESTAMP列を含む行が更新または挿入されるたびに、システムによってTIMESTAMP列が自動的に増加されます。ユーザーがTIMESTAMP列を更新することはできません。 |
NUMBER |
この型の列を維持するには、この列にトリガーを配置する必要があります。Oracleでは、同じ種類の複数のトリガーを設定できます。複数のトリガーすべてを1つの大きなトリガーに統合する必要はありません。完全な互換性を得るために、この列の更新を停止するトリガーを設定できます。 |
|
|
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」ページで定義できます。
この項では、Microsoft SQL ServerまたはSybase Adaptive ServerデータベースとOracle Databaseのデータ記憶域の概念の違いについて説明します。
この項の内容は、次のとおりです。
Microsoft SQL ServerまたはSybase Adaptive ServerデータベースとOracle Databaseのデータ記憶域の概念を比較する表(表2-4)
表に示す情報に基づく推奨事項
表2-4 Oracleと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にも適用する必要があります。特に、オブジェクトの初期サイズおよび物理オブジェクトの配置は重要です。
この項では、表を使用して、Microsoft SQL ServerまたはSybase Adaptive ServerデータベースとOracle Databaseのデータ操作言語(DML)要素の構文と内容を比較します。各表の後で、表の情報に基づく推奨事項を示します。この項では、次の項目について説明します。
表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-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モードと完全に同じわけではありません。 |
Microsoft SQL ServerまたはSybase Adaptive Serverでは、FROM句を指定しないSELECT文がサポートされます。次に例を示します。
SELECT getdate()
Oracleでは、FROM句を指定しないSELECT文はサポートされません。ただし、Oracleでは、常に1行が格納されているDUAL表が提供されます。DUAL表を使用すると、前述のような問合せの構文を変換できます。
前述の問合せを次のように変換します。
SELECT sysdate FROM dual;
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
列別名は、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-7に、OracleのGROUP BYを指定したSELECT文とMicrosoft SQL ServerまたはSybase Adaptive Serverの同じ文との比較を示します。
次の表に示す文は、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-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句の列のリストで使用されている数と同じ数の(互換性のあるデータ型を持つ)列を選択する必要があります。
更新は単一表ビューでのみ実行できます。 |
推奨事項:
FROM句を指定したUPDATE文を変換するには、次の項に説明する2つの方法があります。
列が別の表からの値に更新されている場合は、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;
他のすべての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-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は相関名として表名に指定でき、条件で使用できます。 削除は単一表ビューを介してのみ実行できます。 |
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' );
この項では、Microsoft SQL ServerまたはSybase Adaptive ServerデータベースとOracle Databaseで使用される様々な演算子を比較します。内容は次のとおりです。
表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のみ |
|---|---|---|---|
|
等しい |
= |
||
|
等しくない |
!= <> |
^= |
|
|
未満 |
< |
||
|
より大きい |
> |
||
|
以下 |
<= |
!> |
|
|
以上 |
>= |
!< |
|
|
|
BETWEEN x AND y |
||
|
|
NOT BETWEEN x AND y |
||
|
パターン一致
|
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 |
推奨事項:
すべての!<と!>を>=と<=に変換します。
次のようなMicrosoft SQL ServerまたはSybase Adaptive Serverの例を変換します。
WHERE col1 !< 100
次のようなOracleの構文に変換します。
WHERE col1 >= 100
[ ]と[^]を使用したlike比較演算子を変換します。
SELECT title FROM titles WHERE title like "[A-F]%"
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-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-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-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)
この項では、Microsoft SQL ServerまたはSybase Adaptive ServerデータベースとOracle Databaseで使用される様々なファンクションを比較します。内容は次のとおりです。
表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) |
指定した |
|
|
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-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-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-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で機能します。
この項では、Microsoft SQL ServerまたはSybase Adaptive ServerデータベースとOracle Databaseのロックおよびトランザクション処理を比較します。内容は次のとおりです。
ロックは同時実行性の制御メカニズムとして機能します。複数ユーザー環境では、一度に複数のユーザーが同一のデータを処理する場合があるためロックが必要です。
表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-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-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では、表が読み取られ、同時に更新される場合に、読取り一貫性のあるデータ・セットが作成されます。 読取り一貫性機能は、次のとおりです。
次のコマンドを使用して、トランザクションを読取り専用に指定できます。 SET TRANSACTION READ ONLY |
表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文を発行して、クライアント・アプリケーションから明示的にトランザクションを開始することもできます。