73
Oracle 2 SQL Server 移行ガイド 1 - データベース オブジェクト移行とデータ移行

1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

Embed Size (px)

Citation preview

Page 1: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

Oracle 2 SQL Server 移行ガイド

1 - データベース オブジェクト移行とデータ移行

Page 2: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

2

目次

1. 本ガイドの目的 ................................................................................................................. 5

2. 前提条件 ............................................................................................................................ 5

3. データベース オブジェクトの移行 ................................................................................. 6

3.1 SQL Server のネーミング ルール ............................................................................................................................... 6

3.2 言語ソート パラメータ (照合順序) の移行 ...................................................................................................... 7

3.3 スキーマの移行 ................................................................................................................................................................... 8

3.4 データ型の移行 ................................................................................................................................................................... 8

3.5 表 (テーブル) の移行 ................................................................................................................................................ 10

3.6 索引 (インデックス) の移行 .................................................................................................................................. 12

3.7 ビューの移行 ..................................................................................................................................................................... 14

3.8 シノニムの移行 ................................................................................................................................................................. 15

3.9 順序の移行 .......................................................................................................................................................................... 15

3.10 ストアド プロシージャの移行 .................................................................................................................................. 16

3.11 ユーザー定義関数の移行 .............................................................................................................................................. 17

3.12 DML トリガーの移行 ..................................................................................................................................................... 17

3.13 Oracle Package の移行 .................................................................................................................................................. 19

3.14 エラー ハンドリングの移行 ....................................................................................................................................... 20

3.15 カーソルの移行 ................................................................................................................................................................. 21

3.16 トランザクション ............................................................................................................................................................ 22

3.17 自律型トランザクション .............................................................................................................................................. 23

3.18 トランザクション分離レベル ..................................................................................................................................... 23

3.19 同時実行制御方式 ............................................................................................................................................................ 24

4. クエリの移行 ................................................................................................................... 26

4.1 SQL 全般 ............................................................................................................................................................................. 26

4.2 基本的な SQL 構文 ......................................................................................................................................................... 30

4.3 関数 ........................................................................................................................................................................................ 34

4.4 ORACLE 特有の機能を含んだ SQL .......................................................................................................................... 37

5. データの移行 ................................................................................................................... 45

5.1 移行方式概要 ..................................................................................................................................................................... 45

5.2 直接データ移行 ................................................................................................................................................................. 45

5.3 間接データ移行 ................................................................................................................................................................. 47

5.4 Integration Service による直接データ移行 .......................................................................................................... 47

5.4.1 パッケージの作成 ....................................................................................................................................................... 47

5.4.2 データ移行時の注意点 .............................................................................................................................................. 50

補足 A. SQL Server Migration Assistant for Oracle (SSMA) .......................................... 52

A1 SQL Server Migration Assistant for Oracle (SSMA) .................................................................................................. 52

Page 3: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

3

A.1.1 SSMA 5.2 のシステム要件 ................................................................................................................................................ 52

A.1.2 SSMA 5.2 のインストール ................................................................................................................................................ 53

A.1.3 SSMA Extension Pack のインストール .......................................................................................................................... 57

A.1.4 SSMA の起動 .......................................................................................................................................................................... 61

A.1.5 プロジェクトの作成 ............................................................................................................................................................ 65

A.1.6 レポートの作成 ...................................................................................................................................................................... 67

A.1.7 レポートの見方 ...................................................................................................................................................................... 68

補足 B.Oracle Migration Assessment について ............................................................. 72

B.1 Oracle Migration Assessment ............................................................................................................................................... 72

B.2 Oracle Migration Assessment 集計結果 .......................................................................................................................... 72

B.2.1 オブジェクト毎の自動変換率 .......................................................................................................................................... 72

B.2.2 オブジェクト毎の移行工数 ............................................................................................................................................... 73

Page 4: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

4

[注意事項]

このドキュメントに記載されている情報 (URL 等の Web サイトに関する情報を含む) は、将来予告なしに変更することがあります。

このドキュメントは情報提供のみを目的としており、明示または黙示に関わらず、これらの情報及び情報を使用した結果についてマイ

クロソフトはいかなる責任も負わないものとします。また、このドキュメントに記載された内容は作成日時点の情報に基づくものです。

お客様がこのドキュメント及び本製品を使用した結果については、すべてお客様が負うものとします。このドキュメントのご利用にあ

たっては、お客様ご自身の責任において、適用されるすべての著作権関連法規に従う必要があります。このドキュメントのいかなる部

分も、特に記載のない限り、米国 Microsoft Corporation の書面による許諾を受けることなく、その目的を問わず、どのような形態で

あっても、複製または譲渡することは禁じられています。ここでいう形態とは、複写や記録など、電子的な、または物理的なすべての

手段を含みます。

マイクロソフトは、このドキュメントの内容に関し、特許権、特許出願、商標権、著作権、またはその他の知的財産権を有する場合が

あります。別途マイクロソフトのライセンス契約に明示されない限り、このドキュメントはこれらの特許権、商標権、著作権、または

その他の知的財産権に関する権利をお客様に許諾するものではありません。

特に記載されていない場合、このソフトウェアおよび関連するドキュメントで使用している会社、組織、製品、ドメイン名、電子メー

ル アドレス、ロゴ、人物、出来事などの名称は架空のものです。実在する会社名、組織名、商品名、個人名などとは一切関係ありませ

ん。

© 2013 Microsoft Corporation. All rights reserved.

Microsoft、Windows、MSDN、SQL Server、Visual Basic、Visual C++、Visual C#、Visual Studio は、米国 Microsoft Corporation

またはその関係会社の米国およびその他の国における登録商標または商標です。

記載されている会社名、製品名には、各社の商標も含まれます。

[追記]

お客様は、引用元を明記し、かつ、記載内容を変更しない場合に限り、このドキュメントの一部を引用することができます。但し、こ

のドキュメントからの引用部分とその他の部分を明確に区別しなければなりません。

お客様は、このドキュメントを改変せずに複製する場合に限り、かかる複製物を、無償で、 頒布することができます。但し、その場合

は、著作権者は Microsoft Corporation であること及び上記の注意事項を明示しなければなりません。

Page 5: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

5

1. 本ガイドの目的

本ガイドでは、Oracle を用いて構築されたデータベース システムを、SQL Server 環境へ移行する際の考慮

点、特にデータベース オブジェクトとデータベース データの移行時の考慮点についてまとめています。

2. 前提条件

本ガイドで対象とする SQL Server 及び Oracle のバージョンは以下の通りです。

SQL Server

SQL Server 2012

Oracle

Oracle Database 10g Release2 (10.2)

Oracle Database 11g Release 1

Page 6: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

6

3. データベース オブジェクトの移行

3.1 SQL Server のネーミング ルール

SQL Server の識別子 (データベース名、テーブル名、列名等) は以下のルールに従う必要があり、規則に

従わない場合は識別子を ”” (ダブル クォート) あるいは [] (ブラケット) で囲む必要があります。なお、

変数名およびストアド プロシージャのパラメータ名は、必ず標準識別子の規則に従う必要があります。

最初の文字が次のいずれかである必要があります。

Unicode 規格 3.2 で定義されている文字。Unicode の文字定義には、各国言語の文字の他に、

ラテン文字 a ~ z と A ~ Z も含まれます。

アンダー スコア (_) 、アット マーク (@) 、または番号記号 (#) 。

SQL Server では、識別子の先頭にある一定の記号には特別な意味があります。アット マーク

で始まる識別子はローカル変数またはローカル パラメータを表します。番号記号 (#) で始ま

る識別子は一時テーブルまたは一時プロシージャを表します。2 つの番号記号 (##) で始ま

る識別子は、グローバルな一時オブジェクトを表します。

一部の Transact-SQL 関数の名前は、2 つのアット マーク (@@) から始まります。これら

の関数との混同を避けるために、@@ から始まる名前は使用しないでください。

先頭以外では、次の文字を使用できます。

Unicode 規格 3.2 で定義されている文字

Basic Latin スクリプトまたはその他の各国スクリプトの 10 進数

アット マーク、ドル記号 ($) 、番号記号、またはアンダー スコア

Transact-SQL 予約語を識別子として使用することはできません。SQL Server では予約語は

大文字、小文字共に予約されています。

スペース ([]や””が必要) および特殊文字は使用できません。

Transact-SQL 予約語を識別子として使用することはできません。SQL Server の予約語は、

大文字、小文字共に予約されています。

埋め込み型スペースおよび特殊文字は使用できません。

補助文字は使用できません。

Page 7: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

7

3.2 言語ソート パラメータ (照合順序) の移行

分類 Oracle SQL Server 備考

言語ソート・パラメータ

(照合順序)

NLS_SORT

(デフォルトは BINARY) 照合順序

(日本語デフォルトは

Japanese_CI_AS)

NLS_COMP

(デフォルトは BINARY)

Oracle の言語ソート パラメータがデフォルト (BINARY) の場合は、SQL Server の照合順序は、

バイナリ (コードポイント) (_BIN2) を指定します。

SQL Server の照合順序の並べ替え順序で選択可能な項目は以下の通り。

① バイナリ (_BIN)

バイナリ並び替え順では、大文字小文字とアクセントが区別される

各文字に定義されているビット パターンに基づいて、SQL Server テーブルのデータの並べ替

えおよび比較が行われる

Unicode データは最初の文字が WCHAR として比較された後、続いてバイト単位の比較が行

われる

② バイナリ (コードポイント) BIN2 (_BIN2)

バイナリ並び替え順では、大文字小文字とアクセントが区別される

各文字に定義されているビット パターンに基づいて、SQL Server テーブルのデータの並べ

替えおよび比較が行われる

Unicode データの Unicode コード ポイントに基づいて、SQL Server テーブル内のデータが

並べ替えられ、比較される

非 Unicode データの場合、バイナリ並べ替えと同じ比較が行われる

③ 大文字小文字を区別する (_CS)

大文字と小文字が区別される。このオプションを選択した場合、最初に小文字、その後で

大文字が並べ替えられる

このオプションを選択しない場合は、大文字と小文字を同じものとして並べ替えが行われる

④ アクセントを区別する (_AS)

アクセントのある文字とアクセントのない文字が区別される。たとえば、“a” と “ấ” は等しく

ない

このオプションを選択しない場合、アクセントのある文字とアクセントのない文字が同じもの

と見なされ、並べ替えが行われる

⑤ かなを区別する (_KS)

日本語のひらがな文字とカタカナ文字が区別される

このオプションを選択しない場合は、ひらがなとカタカナを同じものと見なして並べ替えが行

われる

Page 8: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

8

⑥ 文字幅を区別する (_WS)

同一文字の 1 バイト表現と 2 バイト表現が区別される

このオプションを選択しない場合は、同一文字の 1 バイト表現と 2 バイト表現を同じものと

見なして、並べ替えが行われる

⑦ 補助文字 (_SC)

補助文字は、90 以上の照合順序バージョンで、並べ替えと比較の操作に使用できる

すべての _100 レベルの照合順序で、補助文字の言語的な並べ替えがサポートされている

補助文字は、データベース オブジェクトの名前など、メタデータ内で使用することはできない

SQL Server 2012 では、新しい補助文字 (SC) の照合順序が、nchar、nvarchar、および

sql_variant の各データ型で使用することができる

SC フラグは、以下に適用することができる

・バージョン 90 の Windows 照合順序

・バージョン 100 の Windows 照合順序

SC フラグは、以下に適用することはできない

・バージョン 80 バージョンなしの Windows 照合順序

・BIN または BIN2 バイナリ照合順序

・SQL* 照合順序

3.3 スキーマの移行

Oracle スキーマの移行には 2 つの方式があります。

1) Oracle スキーマを SQL Server データベースへ対応づけます。Oracle で複数のスキーマを定義している

場合、SQL Server に複数のデータベースを作成します。それぞれのデータベースでは Oracle スキーマ

を dbo に変換します。

2) Oracle スキーマを SQL Server スキーマに対応づけます。Oracle のスキーマが相互に関連づけられてい

る場合、この方式を用います。

3.4 データ型の移行

Oracle で使用頻度の高いデータ型と対応する SQL Server のデータ型は以下の通りです。

分類 Oracle SQL Server 備考

数値型 NUMBER (p,s)

p⇒1~38

s⇒-84~127

両方指定しなければ最大精

p のみ指定の場合 s=0

numeric (p,s)

p⇒1~38

s⇒0~p

p と s のデフォルト値は、p=18、

s=0

Page 9: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

9

NUMBER (18,0)

NUMBER (10,0)

bigint -2^63 (-9,223,372,036,854,775,808)

~2^63-1

(9,223,372,036,854,775,807)

NUMBER (9,0)

NUMBER (5,0)

int -2^31 (-2,147,483,648)

~2^31-1 (2,147,483,647)

NUMBER (4,0)

NUMBER (3,0)

smallint -2^15 (-32,768)

~2^15-1 (32,767)

NUMBER (2,0) tinyint

0~255

NUMBER (1,0) bit

1 または 0

取りうる値が 1 もしくは 0

であることが決まっている

場合のみ bit を使用する

文字型 CHAR (n)

n は文字数かバイト

2000 バイトまで

char (n)

VARCHAR2 (n)

n は文字数かバイト

4000 バイトまで

varchar (n)

NCHAR (n)

n は文字数

2000 バイトまで

nchar (n)

NVARCHAR2 (n)

n は文字数

4000 バイトまで

nvarchar (n)

日時型 DATE

紀元前 4712 年 1 月 1 日~

紀元 9999 年 12 月 31 日

秒まで

TIMESTAMP (n)

紀元前 4712 年 1 月 1 日~

紀元 9999 年 12 月 31 日

小数点以下 9 桁秒まで

datetime

1753 年 1 月 1 日~

9999 年 12 月 31 日

小数点以下 3 桁秒まで

8 バイト

datetime2 (n)

1 年 1 月 1 日~

9999 年 12 月 31 日

小数点以下 7 桁秒まで

有効桁数が 3 未満の場合 6 バイト

有効桁数が 3 および 4 の場合は 7

バイト

それ以上では 8 バイト

smalldatetime

1900 年 1 月 1 日~

2079 年 6 月 6 日まで

精度 分まで

4 バイト

バイナリ型 RAW (n)

n は 2000 (バイト) まで

binary (n)

Page 10: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

10

ラージ オブジ

ェクト (LOB)

CLOB

Oracle 標準ブロックサイズ

× (4G-1) バイト

varchar (max)

NCLOB

Oracle 標準ブロックサイ

ズ× (4G-1) バイト

nvarchar (max)

BLOB

Oracle 標準ブロックサイズ

× (4G-1) バイト

varbinary (max)

ファイル参照

BFILE 4GB

直接対応するデータ型はなし

SQL Server 2012

FILESTREAM ,FileTable を用いて近

い機能を実現することは可能

Oracle:データベース外に保

存された大きなバイナリ フ

ァイルへのロケーターを保

LONG 型 LONG

2GB-1 バイト

varchar (max)

LONG RAW

2GB-1 バイト

varbinary (max)

3.5 表 (テーブル) の移行

Oracle で使用頻度の高い表と対応する SQL Server のテーブルは以下の通りです。

分類 Oracle SQL Server 備考

表 (テーブル) 表 ヒープ テーブル

または

クラスタ化テーブル

SQL Server ではクラスタ化イ

ンデックスを作成してクラス

タ化テーブルとすることが一

般的

索引構成表 クラスタ化テーブル

パーティション表 パーティション テーブル SQL Server ではハッシュ パ

ーティションおよびリスト パ

ーティションは対応していな

クラスタ表 対応なし

外部表 リンク サーバーやデータのイ

ンポートで移行

Oracle では、通常の表のデータはヒープ構造に並び替えられずに保存されます。

SQL Server ではテーブルに設定されるいずれかのインデックスをクラスタ化インデックスとし、

インデックスのリーフ ノードにデータを格納することが一般的です。このため索引構成表に加え

通常の表についてもクラスタ化テーブルに移行します。

Page 11: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

11

クラスタ化テーブルのイメージ

表に設定されているどの索引をクラスタ化インデックスに移行すべきかについては『3.6.索引 (インデ

ックス) の移行』をご参照下さい。

Oracle では表の作成時に格納先の表領域を指定しますが、SQL Server のクラスタ化テーブルではクラ

スタ化インデックスのリーフ ノードに行が格納されるため、クラスタ化インデックスの格納先が行の

格納先となります。行を特定のファイル グループに格納する必要がある場合はクラスタ化インデック

スの格納先を指定することで間接的に指定します。

Oracle、SQL Server ともに、テーブル作成時に DEFAULT キーワードを使用して列のデフォルト値を設

定できます。デフォルト値に現在の日付を用いる場合の記述方法が異なるので注意が必要です。

CREATE TABLE 文の例 (Oracle)

CREATE TABLE customer

(

id CHAR (3) PRIMARY KEY,

name VARCHAR2 (30) NOT NULL,

address VARCHAR2 (50) ,

regdate DATE DEFAULT SYSDATE

) TABLESPACE tablespace1

「TABLESPACE」を用いてテーブルの格納先の表領域を指定しています。

SYSDATE を使用して、INSERT 時点の日時をデフォルト値に指定しています。

Page 12: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

12

CREATE TABLE 文の例 (SQL Server)

CREATE TABLE customer

(

id char (3) NOT NULL,

name varchar (30) NOT NULL,

address varchar (50) ,

regdate datetime DEFAULT getdate () ,

PRIMARY KEY CLUSTERED

(

id ASC

) ON [PRIMARY] --クラスタ化インデックスの格納先ファイル グループを指定しています。

) ON [PRIMARY] --テーブルの格納先ファイル グループを指定しています。

「PRIMARY KEY」の後に続く「CLUSTERED」で主キーのインデックスをクラスタ化することを

指定しています。

「ON」を用いテーブル本体、クラスタ化インデックスの格納先のファイルグループを指定して

います。

getdate () を使用して、INSERT 時点の日時をデフォルト値に指定しています。

3.6 索引 (インデックス) の移行

Oracle で使用頻度の高い索引と対応する SQL Server のインデックスは以下の通りです。

分類 Oracle SQL Server 備考

索引

(インデックス)

索引

非クラスタ化インデックス

または

クラスタ化インデックス

クラスタ化インデックス

1 テーブルに 1 つ

非クラスタ化インデックス

1 テーブルに 999

キー列の最大バイト数

900 バイト

昇順、降順ともに対応

SQL Server はキー圧縮に対応し

ていない

コンポジット索引

キー列

32 列まで指定可能

複合インデックス

キー列

16 列まで指定可能

キー列の最大バイト数

900 バイト

Page 13: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

13

キー列の合計最大バイト

900 バイト

索引構成表 クラスタ化インデックス

パーティション索引 パーティション インデックス SQL Server ではハッシュ パー

ティションおよびリスト パーテ

ィションは対応していない

※データ ファイルへの IO 方

式がラウンドロビンのため、ハッ

シュ パーティションで IO 分

散したい場合には複数データ

ファイルをファイル グループに

含めることで同様の対処が可能。

ビットマップ索引 対応なし

逆キー索引 対応なし

関数索引 対応なし

全文検索 Oracle Text フルテキスト インデックス

SQL Server では、キー列及びキー列の合計サイズが 900 バイトを超えている列は、インデックスの

キーとすることができません。

900 バイトを超える列にインデックスを設定する方法としては、計算列及び計算列へのインデックス

追加を用いたハッシュインデックスの使用が考えられます。なお、ハッシュ インデックスは等値比較

(=を用いた比較) のみ有効なインデックスとなります。

ハッシュ インデックスの作成例 (SQL Server)

--Procut テーブルへ長い文字列が格納されている Name 列のハッシュ値を格納する列を追加します。

--CHECKSUM 関数はパラメータで指定された値に基づくハッシュ値を返します。

ALTER TABLE Production.Product

ADD cs_Pname AS CHECKSUM (Name) ;

--ハッシュ値が格納されている cs_Pname 列にインデックスを設定し、ハッシュインデックスを作成します。

CREATE INDEX Pname_index ON Production.Product (cs_Pname) ;

Page 14: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

14

ハッシュ インデックスを用いるクエリ例 (SQL Server)

--Procutテーブルへ長い文字列が格納されている Name 列のハッシュ値を格納する列を追加します。

--CHECKSUM 関数はパラメータで指定された値に基づくハッシュ値を返します。

SELECT *

FROM Production.Product

WHERE cs_Pname=CHECKSUM (N'Bearing Ball') --ハッシュ値を検索条件に追加

AND Name = N'Bearing Ball'; --ハッシュ値で発生する可能性のあるシノニム

--に対応するため、実際の値についての

--検索条件の指定も必要です。

一意キーは Oracle では複数の行に NULL を格納できますが、SQL Server では NULL は 1 行 のみ

しか格納できません。アプリケーションの対応が必要です。

SQL Server で全文検索を行うには、フルテキスト検索機能を使用します。フルテキスト検索を使用

するためには、SQL Server の導入時にデータベース エンジンのサブ コンポーネントである

「フルテキスト検索」を導入し、「SQL Full-text Filter Daemon Launcher」サービスを起動しておきます。

フルテキスト カタログを作成し、フルテキスト インデックスを作成することで全文検索が可能となり

ます。

3.7 ビューの移行

Oracle で使用頻度の高いビューと対応する SQL Server のビューは以下の通りです。

分類 Oracle SQL Server 備考

ビュー ビュー 標準のビュー

マテリアライズドビュー インデックス付きビュー マテリアライズド ビューは、

SSMA では通常のテーブルに

変換される

リフレッシュ タイミングな

ど、運用面での差異あり (イン

デックス付きビューでは、任意

のタイミングでリフレッシュ

することはできません)

SQL Server ではビューの属性に READ ONLY を指定することはできません。

Page 15: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

15

3.8 シノニムの移行

分類 Oracle SQL Server 備考

シノニム シノニム シノニム SSMA では、パブリックシノニ

ムは sysdb データベースに通

常のシノニムとして登録され

パブリックシノニム シノニム

Oracle のパブリックシノニムを SQL Server に移行する場合は注意が必要です。SQL Server のシノニ

ムは必ずスキーマ内に格納する必要があります。SSMA でユーザー定義関数に対するシノニムを使用し

ている場合、SSMA のレポート作成でエラーが発生する場合があります。

3.9 順序の移行

分類 Oracle SQL Server 備考

その他 順序 順序

SQL Server 2012 からシーケンス オ

ブジェクトが実装されました。Oracle

との違いはシーケンスに指定できる

値で、Oracle は正の値の場合は 28 桁

以内、負の値の場合は 27 桁以内の値。

SQL Server 2012 では任意の整数型を

指定可能で、デフォルト値の bigint 型

を使用する場合の範囲は

-9,223,372,036,854,775,808 ~

9,223,372,036,854,775,807 になりま

Page 16: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

16

3.10 ストアド プロシージャの移行

SQL Server のストアド プロシージャは、サブ プログラムをネストすることはできません。Oracle 環境での

ストアド プロシージャがネストされたサブプログラムを持つ場合、単一のストアド プロシージャに展開す

るか、外部のストアド プロシージャをコールする必要があります。

Oracle の例

create procedure Proc1 is

procedure DeptSales (dept_id int) is

lv_sales int;

begin

select sales into lv_sales from departmentsales where id = dept_id;

end DeptSales;

begin

DeptSales (100) ;

end Proc1;

SQL Server で外部のストアド プロシージャをコールする例

CREATE PROCEDURE Proc1$DeptSales

@dept_id int

AS

declare @lv_sales int

Select @lv_sales = sales From departmentsales Where id = @dept_id

RETURN

GO

CREATE PROCEDURE Proc1

AS

Execute Proc1$DeptSales 100

RETURN

GO

Page 17: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

17

3.11 ユーザー定義関数の移行

Oracle ユーザー定義関数を移行するうえで注意する点は次のとおりです。

SQL Server ユーザー定義関数は DML ステートメントを記述できない

SQL Server ユーザー定義関数はストアド プロシージャをコールできない

SQL Server ユーザー定義関数はトランザクション制御ステートメントを記述できない

SSMA による移行では、ユーザー定義関数内に記述された拡張ストアド プロシージャが、上述項目の動作が

可能なユーザー ストアド プロシージャをコールする構造に変換されます。

SSMA を利用しない移行では、ユーザー定義関数を、上述項目を含まないユーザー定義関数と、上述項目を

含むストアド プロシージャに分ける必要があります。

3.12 DML トリガーの移行

一般的に Oracle トリガーが行レベルのトリガーであるのに対して、SQL Server のトリガーはステートメン

ト レベルのトリガーのみとなります。

テーブル レベルのトリガーは SQL Server の AFTER トリガーと同様に扱うことができます。

CREATE TRIGGER [ schema. ]trigger ON <table>

AFTER <UPDATE |INSERT | DELETE>

AS

/* beginning of trigger implementation */

SET NOCOUNT ON

------------------------------------------------------------------------

/* Oracle-trigger implementation: begin */

BEGIN

-- UPDATE OF CLAUSE FOR TRIGGER FOR UPDATE EVENT

-- (UPDATE OF COLUMN[, COLUMN] ... ])

IF (UPDATE (<COLUMN>) OR UPDATE ( (<COLUMN>) ...)

BEGIN

<TRIGGER_BODY>

END

END

/* Oracle-trigger implementation: end */

------------------------------------------------------------------------

/* end of trigger implementation */

:NEW や:OLD 変数は、INSERTED や DELETED テーブルに格納されます。行レベルのトリガー移行はカーソ

ルを利用する必要があります。

次の例では AFTER INSERT トリガーの移行を示します。

Page 18: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

18

CREATE TRIGGER [ schema. ]trigger ON <table>

AFTER INSERT

AS

/* beginning of trigger implementation */

SET NOCOUNT ON

/* column variables declaration */

DECLARE

/* declare variables to store column values.

if trigger has no references to :OLD or :NEW

records then define the only uniqueidentifier type variable

to store ROWID column value */

@column_new_value$0 uniqueidentifier

/* trigger has NO references to :OLD or :NEW* or has explicit reference to ROWID/

/* trigger has references to :OLD or :NEW*/

@column_new_value$X <COLUMN_X_TYPE>,

@column_new_value$Y <COLUMN_Y_TYPE>,

...

@column_old_value$A <COLUMN_A_TYPE>,

@column_old_value$B <COLUMN_B_TYPE>

...

/* iterate for each for from inserted/updated table (s) */

DECLARE ForEachInsertedRowTriggerCursor CURSOR LOCAL FORWARD_ONLY READ_ONLY

FOR

/* trigger has NO references to :OLD or :NEW*/

SELECT ROWID FROM inserted

/* trigger has references to :OLD or :NEW* or has explicit reference to ROWID/

SELECT [ROWID], <COLUMN_X_NAME>,<COLUMN_Y_NAME> .. FROM inserted

OPEN ForEachInsertedRowTriggerCursor

FETCH NEXT FROM ForEachInsertedRowTriggerCursor INTO

/* trigger has NO references to :OLD or :NEW* or has explicit reference to

ROWID /

@column_new_value$0

/* trigger has references to :NEW*/

@column_new_value$X

@column_new_value$Y

...

Page 19: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

19

WHILE @@fetch_status = 0

BEGIN

------------------------------------------------------------------------

/* Oracle-trigger implementation: begin */

BEGIN

IF <WHILE_CLAUSE>

BEGIN

<TRIGGER_BODY>

END

END

/* Oracle-trigger implementation: end */

------------------------------------------------------------------------

FETCH NEXT FROM ForEachInsertedRowTriggerCursor INTO

/* trigger has NO references to :NEW or has explicit reference to ROWID */

@column_new_value$0

/* trigger has references to :NEW*/

@column_new_value$X, @column_new_value$Y ...

END

CLOSE ForEachInsertedRowTriggerCursor

DEALLOCATE ForEachInsertedRowTriggerCursor

/* end of trigger implementation */

3.13 Oracle Package の移行

Oracle Package では、変数、型、ストアド プロシージャ、ユーザー定義関数をカプセル化して利用すること

ができます。SQL Server の移行では、Package のそれぞれのオブジェクトを個別に定義します。また、SSMA

を利用した場合、Oracle Package は SQL Server のストアド プロシージャやユーザー定義関数に変換されます。

Page 20: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

20

3.14 エラー ハンドリングの移行

Oracle の EXCEPTION は、SQL Server では TRY~CATCH へ移行します。

Oracle のエラー ハンドリングの例

declare

myexception exception;

BEGIN

IF <condition> THEN

RAISE myexception;

END IF;

EXCEPTION

WHEN myexception THEN

<Statements>

END

SQL Server のエラー ハンドリングの例

BEGIN TRY

IF <condition>

RAISERROR (‘myexception’, 16, 1)

END TRY

BEGIN CATCH

IF ERROR_MESSAGE () = ‘myexception’

BEGIN

<Statements>

END

ELSE

<rest_of_handler code>

END CATCH

Page 21: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

21

3.15 カーソルの移行

カーソルで使用する多くのパラメータは単純移行が可能ですが、一部の機能はコーディングでカバーするこ

とになります。

操作 Oracle SQL Server

Declaring a

cursor

CURSOR cursor_name [ (cursor_parameter

(s) ) ]

IS select_statement;

DECLARE cursor_name CURSOR

[LOCAL | GLOBAL]

[FORWARD_ONLY | SCROLL]

[STATIC | KEYSET | DYNAMIC |

FAST_FORWARD]

[READ_ONLY | SCROLL_LOCKS |

OPTIMISTIC]

[TYPE_WARNING]

FOR select_statement

[FOR UPDATE [OF column_name [,…n]]]

Ref cursor

type

definition

TYPE type_name IS REF CURSOR

[RETURN

{ {db_table_name | cursor_name |

cursor_variable_name} % ROWTYPE

| record_name % TYPE

| record_type_name

| ref_cursor_type_name}];

Removes a REF cursor definition and

converts it to a variable declaration

as follows:

cursor_variable_declaration ::=

cursor_variable_name type_name;

Convert to:

@cursor_variable_name CURSOR;

Opening a

cursor

OPEN cursor_name [ (cursor_parameter

(s) ) ];

OPEN cursor_name

Cursor

attributes

{ cursor_name

| cursor_variable_name

| :host_cursor_variable_name}

% {FOUND | ISOPEN | NOTFOUND |

ROWCOUNT}

次のような変数・関数への移行

@@FETCH_STATUS

CURSOR_STATUS ()

SQL cursors SQL %

{FOUND | ISOPEN | NOTFOUND | ROWCOUNT

| BULK_ROWCOUNT (index) |

BULK_EXCEPTIONS (index) .{ERROR_INDEX

| ERROR_CODE}}

次のようなコードへの移行

FOUND: Converts to (@@ROWCOUNT > 0)

NOTFOUND: Converts to (@@ROWCOUNT =

0)

ISOPEN: Converts to any condition

that is always false, for example

(1=2)

ROWCOUNT: Converts to @@ROWCOUNT. For

example:

Oracle

IF SQL%FOUND THEN …;

MSSQL

IF @@ROWCOUNT > 0 …

Fetching

from cursor

FETCH cursor_name INTO variable (s) FETCH [[NEXT | PRIOR | FIRST | LAST |

ABSOLUTE {n | @nvar} | RELATIVE {n |

@nvar}]

FROM] cursor_name

[INTO @variable (s) ]

Update

fetched row

UPDATE table_name

SET statement (s) …

WHERE CURRENT OF cursor_name;

UPDATE table_name

SET statement (s) …

WHERE CURRENT OF cursor_name

Delete DELETE FROM table_name DELETE FROM table_name

Page 22: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

22

fetched row WHERE CURRENT OF cursor_name; WHERE CURRENT OF cursor_name

Closing

cursor

CLOSE cursor_name; CLOSE cursor_name

Remove

cursor data

structures

N/A DEALLOCATE cursor_name

OPEN … FOR

cursors

OPEN {cursor_variable_name

| :host_cursor_variable_name}

FOR dynamic_string [using_clause]

次のようなコードへの移行

DECLARE

@auxiliary_cursor_definition_sql$N

NVARCHAR (max) ,

@auxiliary_exec_param$N NVARCHAR

(max)

IF (cursor_status ('variable',

N'<cursor_variable_name>') > -2)

DEALLOCATE

<cursor_variable_name>

SET @auxiliary_exec_param$N =

'[@auxiliary_paramN <datatype>

[OUTPUT],] … @auxiliary_tmp_cursor$N

cursor OUTPUT'

3.16 トランザクション

Oracle のトランザクション モデルでは、INSERT、UPDATE、DELETE あるいはその他の DML が実行された

時、自動的にトランザクションが開始されます。アプリケーションは COMMIT を明示的に実行する必要が

あります。

SQL Server では、利用する API によって異なりますが、Transact-SQL では自動コミットが既定となってい

ます。Oracle と同じトランザクショ モデルを利用するには、暗黙的トランザクションを設定する必要があ

ります。

暗黙的トランザクションの設定

SET IMPLICIT_TRANSACTIONS ON

Page 23: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

23

3.17 自律型トランザクション

SQL Server には Oracle の自律型トランザクションに該当する機能は存在しません。

Oracle で AUTONOMOUS_TRANSACTION が設定されているオブジェクトは、SQL Server に移行するにあた

り複数のオブジェクトに分割し、それぞれ別のトランザクションとして呼び出す必要があります。

TRY~CATCH の CATCH ブロックの中で、エラー処理としてオブジェクトを変更しなければならない場合は、

新たにトランザクションを開始する必要があります。

BEGIN TRAN

BEGIN TRY

-- エラー発生

END try

BEGIN CATCH

ROLLBACK -- ロールバック

BEGIN TRAN

-- エラー処理

COMMIT

END CATCH

IF @@TRANCOUNT > 0 COMMIT

3.18 トランザクション分離レベル

Oracle と SQL Server のトランザクション分離レベルの対応は以下の通りです。

ANSI/ISO SQL 規格 Oracle SQL Server 備考

Read UnCommitted × ○

Read Committed ○ (デフォルト) ○ (デフォルト) Oracle と SQL Server で、同時実行制御方式に差

異あり

Repeatable Read × ○

Serializable △ ○

Oracle と SQL Server のデフォルトのトランザクション分離レベルである Read Committed は、同時

実行制御方式の違いにより、排他ロック取得時の挙動が異なります。

Oracle Database では、Serializable の挙動を完全に処理することはできません。

Page 24: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

24

3.19 同時実行制御方式

Oracle の同時実行制御方式は、マルチバージョニング方式 (オプティミスティック同時実行制御) を採用し

ています。

マルチバージョニング方式とは、対象となるリソースに対して排他ロックを取得している間も更新前のコミ

ット済みデータを参照することができる方式です。あるトランザクションで更新処理を実行し、未 COMMIT

の状態のトランザクションがある場合でも、更新前のデータを SELECT で参照することができます。

SQL Server の同時実行制御方式はロック方式 (ペシミスティック同時実行制御) を採用しています。ロック

方式とは、対象となるリソースに対して排他ロックを取得している間、参照処理を待機させる方式です。

これにより、同時実行制御を厳密に行うことが可能ですが、トランザクションが長い処理などを実行すると、

参照処理で思わぬ遅延が発生することもあり、注意が必要です。

Oracle と SQL Server の同時実行制御方式

SQL Server の Read Committed を Oracle のようなマルチバージョニング方式で動作させる場合、

SQL Server のトランザクション分離レベルを READ_COMMITTED_SNAPSHOT_ISOLATION (RCSI) に変更

する必要があります。

RCSI への変更は、 READ_COMMITTED_SNAPSHOT データベースオプションを ON に設定します。

・SQL Server の Read Committed をマルチバージョニング方式に変更するコマンド

ALTER DATABASE [データベース名] SET READ_COMMITTED_SNAPSHOT ON;

上記コマンドを実行することで、 SQL Server をマルチバージョニング方式で稼働させることができます。

これにより、更新のために排他ロックがかかっている行の更新前レコード (更新前のコミット済みデータ) が

tempdb に格納され、排他ロック取得時でも別のトランザクションから更新前レコードを参照することがで

きるようになり、更新処理による参照処理のロック待ちを低減させることができます。

Page 25: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

25

Oracle Database と SQL Server のロックの違い

Oracle Database でも、SQL Server でも更新対象となっているレコードに対して排他ロックが取得されます

が、更新のために実行した UPDATE 文の条件句 (WHERE 句) で指定した列に対してインデックスが作成

されていない場合、SQL Server では意図しないロック待ちが発生してしまうケースがあります。

たとえば次のような SQL 文を実行するとします。

(Trans1) Begin tran

UPDATE <table> SET NAME = ‘’ WHERE ID = 1;

(Trans2) Begin tran

UPDATE <table> SET NAME = ‘’ WHERE ID = 25;

※Tran1 を実行中に Tran2 を実行

ID 列に対してインデックスが作成されている場合には、上記の SQL 文はどちらもロック待ちは発生せず

正常に終了します。ID 列にインデックスが作成されていない場合、実行プランの中で インデックス シーク

ではなく テーブル スキャンが選択されます。この時、SQL Server では 1 行ずつ更新ロックを取得・解放し

ながら順にスキャンしていき、更新対象レコードがスキャンされた時にそのレコードに対して排他ロックを

取得します。

上記 SQL 文の場合、最初の SQL 文 (Tran1) が ID = 1 のレコードに対して排他ロックを取得した状態で 2

番目の SQL 文 (Tran2) が実行されると、Tran2 は最初の ID = 1 の更新ロックを取得することができず、ロ

ック待ちで待機してしまいます。

このような現象は、以下のような更新ロックを取得する SQL 文でも発生します。

SELECT * FROM <table> WITH (UPDLOCK) WHERE ID = 1;

上記 SQL 文を Tran1 で実行した場合、対象レコードに対して更新ロックが取得されます。この時に、

Tran2 を実行しても更新ロックを取得することができない為、ロック待ちで待機します。

ロックについて詳しくは以下をご参照下さい。

http://msdn.microsoft.com/ja-jp/library/ms186396.aspx

以上のように、SQL Server でロック待ちを低減させるためには RCSI が非常に効果的ですが、明示的に更新

ロックを付けた SELECT 処理、UPDATE, DELETE 処理を実行する場合には、インデックスの有無によってア

クセス パターンが異なることで、前述のようなロック待ちが発生する可能性がある点に留意する必要があり

ます。

Page 26: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

26

4. クエリの移行

4.1 SQL 全般

ここでは SQL で頻繁に利用される、以下の点についての違いを説明します。

コメント

ヒント句の記述

結合処理

演算子

結論から述べると ORACLE と SQL Server での違いは殆どありません。

一部演算子で異なる動作があるものの、ORACLE で記述した内容と SQL Server での記述方法は殆ど同じで

す。以下に例を挙げて ORACLE と SQL Server の違いを見ていきます。

分類 Oracle SQL Server

コメントの記述 単一行コメント、範囲コメントの記述は、SQL

Server と同じです。

単一行コメント (例) -- 改行までコメント

範囲コメント (例) /* ここからここまで

*/

結合ヒント /*+ <ヒント句> */ のように記述します。

結合ヒントは「USE_NL、USE_HASH、

USE_MERGE、DRIVING_SITE」があります。

<使用例>

SELECT /*+ USE_HASH (B) */

*

FROM

TBL_A A

INNER JOIN TBL_B B

ON A.PK = B.PK

テーブルの結合ヒントは ORACLEと同様

「LOOP|HASH|MERGE|REMOTE」の 4種類ありま

す。

下線部に結合ヒント

(LOOP|HASH|MERGE|REMOTE) を記述します。

<使用例>

SELECT

*

FROM

TBL_A A

INNER HASH JOIN TBL_B B

ON A.PK = B.PK

※ ORACLEの DRIVING_SITE ヒントは、SQL

Server の REMOTE に相当します。

クエリ ヒント SQL 文の先頭に記述します。

SELECT、INSERT、UPDATE、DELETE 句の

直後に記述します。

<使用例>

SELECT /*+ ORDERED */

*

FROM

SQL 文の最後に OPTION 句 を使用して記述し

ます。

<使用例>

SELECT

*

FROM

TBL_A A

Page 27: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

27

TBL_A A

INNER HASH JOIN TBL_B B

ON A.PK = B.PK

INNER HASH JOIN TBL_C C

ON A.PK = C.PK

代表的なヒント句には以下があります。

CHOOSE

RULE

FIRST_ROWS

ALL_ROWS

INDEX

INDEX_DESC

ORDERED

APPEND

INNER HASH JOIN TBL_B B

ON A.PK = B.PK

INNER HASH JOIN TBL_C C

ON A.PK = C.PK

OPTION

(FORCE ORDER)

代表的なヒント句には以下があります。

MAXDOP

FAST n

READPAST

ROWLOCK

UPDLOCK

TABLOCK

テーブル ヒント テーブル名の直後に記述します。

SELECT

*

FROM

TBL_A FOR UPDATE NOWAIT

ORACLE と同様、テーブル名の直後に記述します。

SELECT

*

FROM

TBL_A WITH (NOWAIT, UPDLOCK)

結合の種類 テーブルの結合には以下の種類があります。

INNER JOIN

LEFT JOIN

RIGHT JOIN

FULL JOIN

CROSS JOIN

ORACLEと同様、以下の結合の種類があります。

INNER JOIN

LEFT JOIN

RIGHT JOIN

FULL JOIN

CROSS JOIN

結合方法 構文は次のとおりです

<使用例>

SELECT

*

FROM

TBL_A A

LEFT JOIN TBL_B B

ON A.PK = B.PK

構文は Oracle と同じです

<使用例>

SELECT

*

FROM

TBL_A A

LEFT JOIN TBL_B B

ON A.PK = B.PK

算術演算子 + (加算)

- (減算)

* (乗算)

/ (除算)

+ (加算)

- (減算)

* (乗算)

/ (除算)

% (剰余)

<使用例>

SELECT 12 % 5 AS MEMO -- 結果は 2

文字列連結演算子 || (又は関数 (CONCAT) を使用します)

<使用例>

+

<使用例>

Page 28: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

28

SELECT

'1' || '2' AS MEMO

FROM

DUAL -- 結果は '12' (文字列連結)

SELECT

1.5 ||'0.5' AS MEMO

FROM

DUAL -- 結果は '1.50.5' (文字列連

結)

NULL を含む文字列連結では、NULL は長さ

ゼロの文字列 (空文字) として扱われます。

< (例) NULL の文字列連結>

SELECT '1' || NULL AS MEMO

FROM DUAL

MEMO

-------

1

SELECT '1' + '2' AS MEMO -- 結果は

'12' (文字)

SELECT 1.5 + '0.5' AS MEMO -- 結果は 2.0

(数値)

参考: 以下の場合はエラーになります。

SELECT 1 + '0.5' AS MEMO

-- '0.5'をデータ型 int に変換できません

これは、最初に指定している 1 の数値が、SQL

Server 内部では整数型 (小数を使用しないデ

ータ型) として処理されるため、そこに 0.5 を

加算するとみなされエラーとなります。文字列連

結も加算も同じ演算子「+」を使用するので、デー

タ型を適切に指定する必要があります。

SQL Server では NULL を含む文字列連結の結

果は NULLL となります。

< (例) NULLの文字列連結>

SELECT '1' + NULL AS MEMO

MEMO

-------

NULL

NULL を含む可能性のある文字列を連結する場合

は、ISNULL 関数を使用して、以下のように変更

します。

SELECT '1' + ISNULL (NULL,'') AS MEMO

代入演算子 = =

<使用例>

SET @VAL_X = 1 + 2

論理演算子 以下の演算子を使用できます。

ALL

AND

ANY

BETWEEN

EXISTS

IN

LIKE

NOT

ORACLE と同じ演算子を使用できます。

ALL

AND

ANY

BETWEEN

EXISTS

IN

LIKE

NOT

Page 29: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

29

OR

SOME

<ANY の使用例>

SELECT

*

FROM

TBL_A

WHERE

BONUS >= ANY (1000, 2000)

OR

SOME

但し、ORACLE と以下の点が異なります。

SQL Server で SOME、ANY を使用する場合はサ

ブ クエリとして記述します。

ORACLE で左記のように ANY、SOME を記述して

いる場合は、その中をサブ クエリの記述に変更し

ます。

< (例) ANY の記述を変更>

SELECT

*

FROM

TBL_A

WHERE

BONUS >= ANY ( SELECT 1000 AS BUNUS

UNION ALL

SELECT 2000 AS BUNUS

)

集合演算子 UNION

UNION ALL

INTERSECT

MINUS

<使用例>

SELECT * FROM TBL_A

MINUS

SELECT * FROM TBL_B

UNION

UNION ALL

INTERSECT

EXCEPT (ORACLE の MINUS に相当)

<使用例>

SELECT * FROM TBL_A

EXCEPT

SELECT * FROM TBL_B

比較演算子 = (等しい)

> (より大きい)

< (より小さい)

>= (以上)

<= (以下)

<> (等しくない)

!= (等しくない)

^= (等しくない)

= (等しい)

> (より大きい)

< (より小さい)

>= (以上)

<= (以下)

<> (等しくない)

!= (等しくない。ISO 標準外)

!< (より小さくない。ISO 標準外)

!> (より大きくない。ISO 標準外)

その他の演算子 (+) (外部結合で使用)

PRIOR (階層問い合わせで使用)

外部結合演算子 (+) は LEFT JOIN、RIGHT

JOIN で記述します。

階層問い合わせ用の演算子 (PRIOR) は、使用す

る必要はありません。SQL SERVER での階層問い

合わせは CTE (共通テーブル式) を使用した再

帰クエリとして実装するので、特別な演算子は使

用しません。

Page 30: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

30

ビット演算子 <ORACLE 10g 以降>

& (論理積)

| (論理和)

~ (否定)

^ (排他的論理和)

※9i以前のバージョンにはビット演算子はあ

りません。

以下のビット演算子が使用できます。

& (論理積)

| (論理和)

~ (否定)

^ (排他的論理和)

4.2 基本的な SQL 構文

SQL Server は、ANSI SQL 92 に準拠しており ORACLE と同じように SELECT、INSERT、UPDATE、DELETE を

使用することができます。SELECT や INSERT でテーブルを結合した操作を行う場合、ORACLE も SQL Server

も同じです。但し、テーブルを結合しながら UPDATE、DELETE を行う場合は、記述方法が異なります。以

下にこの違いを説明します。

操作 Oracle SQL Server

テーブルを

結合して

UPDATE

UPDATE (

SELECT

T1.ITEM AS ITM1,

T2.ITEM AS ITM2

FROM

TBL1 T1

LEFT JOIN TBL2 T2

ON T1.ITEM = T2.ITEM

WHERE

T2.ITEM IS NULL

) HOGE

SET ITM1 = '無し'

UPDATE TBL1

SET

ITEM = '無し'

FROM

TBL1 T1

LEFT JOIN TBL2 T2

ON T1.ITEM = T2.ITEM

WHERE

T2.ITEM IS NULL

SQL Server では、更新対象となるテーブルを

UPDATE 句 の直後、FROM 句の中 の 2箇所に記述

します (下線部) 。

テーブルを

結合して

DELETE

DELETE FROM TBL1 Tx

WHERE

Tx.ITEM IN (SELECT

T1.ITEM

FROM

TBL1 T1

LEFT JOIN TBL2 T2

ON T1.ITEM = T2.ITEM

WHERE

T2.ITEM IS NULL

DELETE TBL1

FROM

TBL1 T1

LEFT JOIN TBL2 T2

ON T1.ITEM = T2.ITEM

WHERE

T2.ITEM IS NULL

UPDATE の時と同様、削除対象となるテーブルを 2

Page 31: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

31

) 箇所に記述します (下線部) 。

SELECT 句を使用してその結果をもとに、テーブルを作成することがあります。

ORACLE では CREATE TABLE XXX AS SELECT ~ を使用しますが、SQL Server では SELECT 句だけを使用し

ます。以下にこの違いを記述します (注: 実行には CREATE TABLE 権限が必要です) 。

操作 Oracle SQL Server

SELECT 結

果をもとに

テーブルを

作成

--テーブル定義とデータをコピー

CREATE TABLE <<テーブル名_BKUP>>

AS

SELECT * FROM テーブル名

--テーブル定義だけをコピー

CREATE TABLE <<テーブル名_BKUP>>

AS

SELECT * FROM テーブル名

WHERE 1=0

--テーブル定義とデータをコピー

SELECT *

INTO <<テーブル名_BKUP>>

FROM テーブル名

--テーブル定義だけをコピー

SELECT *

INTO <<テーブル名_BKUP>>

FROM テーブル名

WHERE 1=0

ORACLE には DUAL 表 (ダミー表) がありますが、SQL Server にはダミー表はありません。

DUAL 表を使用した SELECT 句 を記述する場合は以下のように記述します。

操作 Oracle SQL Server

ダミー表を

使 用 し た

SELECT

SELECT

123 AS MEMO

FROM

DUAL

※ORACLE では SELECT 構文に従って記述する必要

があるため、上記のようにダミー表を使用して

SELECTを行います。

左記の ORACLE と同じ SELECT を記述する場合

は、以下のように記述します。

SELECT 123 AS MEMO

--「FROM DUAL」の記述は不要です。

<使用例 1> SQL SERVER の関数の実行結果を調

べる

SELECT REPLACE ('ABC','B','★') AS MEMO

<使用例 2> 一時的なデータを作成/利用する場合

SELECT

*

FROM

(SELECT '01月' AS TSUKI

UNION ALL SELECT '02月' AS TSUKI

Page 32: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

32

/* : */

UNION ALL SELECT '12月' AS TSUKI

) TMP

SELECT 句で NULL を含んだデータを並び替えることがあります。

ORACLE と SQL Server では NULL を含むデータの並び順に違いがあります。

以下で ORACLE で NULL を含むデータの並び順と、SQL Server での並び順、および対応方法を説明します。

操作 Oracle SQL Server

NULL の並

び順

NULL のデータの並び順は、SELECT 結果の最後に

なります。

<例: NULL は最後に取得される>

SELECT

*

FROM

(SELECT '0001' AS ITEM FROM DUAL

UNION ALL SELECT '0002' AS ITEM FROM DUAL

UNION ALL SELECT '0003' AS ITEM FROM DUAL

UNION ALL SELECT NULL AS ITEM FROM DUAL

) TMP

ORDER BY

ITEM

ITEM

--------------

0001

0002

0003

(NULL) ←ORACLEではココ

SQL SERVER では NULL のデータは、SELECT

結果の最初に並びます。

<例: ORACLEと同じ SQL を記述した場合>

SELECT

*

FROM

(SELECT '0001' AS ITEM

UNION ALL SELECT '0002' AS ITEM

UNION ALL SELECT '0003' AS ITEM

UNION ALL SELECT NULL AS ITEM

) TMP

ORDER BY

ITEM

ITEM

--------------

NULL ←SQL SERVERではココ

0001

0002

0003

<対応方法 (ORDER BY句を修正する) >

SELECT

: (途中省略)

ORDER BY

-- ITEM

-- ↓これで ORACLE と同じ並び順になりま

CASE WHEN ITEM IS NULL THEN '9999' ELSE

ITEM END

Page 33: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

33

空白を含む文字列を比較 (*1) する場合は以下の点に気をつける必要があります。

(*1 … DECODE 関数や CASE 関数、WHERE 句など)

操作 Oracle SQL Server

空白を含む

文字列の比

以下の結果は「不一致」が取得されます。

SELECT

CASE WHEN CHAR1 = CHAR2 THEN '一致' ELSE

'不一致' END AS MEMO

FROM

(SELECT

'ABC' AS CHAR1, -- これは CHAR型

CAST ('ABC ' AS VARCHAR (10) ) AS

CHAR2 -- VARCHAR型 (最後空白)

FROM

DUAL

) TMP

ORACLE では「空白埋め比較セマンティクスおよ

び非空白埋め比較セマンティクス」というデータ

型を比較するルールがあります。簡単にいうと、

次の例のように CHAR 型 どうしでの文字列比較

は「文字列の短い方に、文字列が長い方と同じ長

さになるまで空白を付加し、その後で文字列の比

較を行うというものです」。

<例: 結果が「一致」になるケース>

SELECT

CASE WHEN CHAR1 = CHAR2 THEN '一致' ELSE

'不一致' END AS MEMO

FROM

(SELECT

'ABC' AS CHAR1, -- これは CHAR型

CAST ('ABC ' AS CHAR (10) ) AS CHAR2

-- これも CHAR 型 (最後空白)

FROM

DUAL

) TMP

以下の結果は「一致」が取得されます。

SELECT

CASE WHEN CHAR1 = CHAR2 THEN '一致' ELSE

'不一致' END AS MEMO

FROM

(SELECT

'ABC' AS CHAR1, -- これは CHAR型

CAST ('ABC ' AS VARCHAR (10) ) AS

CHAR2

-- VARCHAR型 (最後空白)

) TMP

※ORACLE の VARCHAR や VARCHAR2 型など、可

変長文字列型の最後に空白が含まれる場合、

ORACLE と SQL Server での空白を含む文字列の

判断方法の違いに注意する必要があります。

Page 34: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

34

ORACLE でも SQL Server でも SQL 文の中で 定数 を記述することがあります。

定数が指定された場合、ORACLE と SQL Server が自動的にデータ型を割り当てますが、自動的に割り当て

られた内部データ型が何になるかを以下で説明します。

操作 Oracle SQL Server

定数を指定

した時の内

部データ型

SQL 文で定数を指定した場合の内部データ型は以

下となります。

1 … NUMBER

1.0 … NUMBER

1.00 … NUMBER

'A' … CHAR (1)

'AB' … CHAR (2)

REPLACE ('ABC','B','') … VARCHAR2 (2)

CAST ('A' AS CHAR (4) ) … CHAR (4)

SQL Server で ORACLE と同じ定数を指定した場

合の内部データ型は以下となります。

1 … int --★整数型

1.0 … numeric (2, 1)

1.00 … numeric (3, 2)

'A' … VARCHAR (1) --★ORACLEは CHAR型

'AB' … VARCHAR (2) -- ★ORACLEは CHAR型

REPLACE ('ABC','B','') … VARCHAR (8000)

–-★

CAST ('A' AS CHAR (4) ) … CHAR (4) --◎

ORACLE と比較しても、基本的に内部データ型に大

きな違いはありませんが、★の箇所のような違いがあ

ります。

定数を指定した場合、厳密なデータ型とならなけれ

ばならない場合は、◎のように CAST 関数を使用し

て明示的なデータ型を指定します。

4.3 関数

ORACLE で利用頻度が高いと思われる関数を挙げ、SQL Server でその関数と同じことを行う場合、どのよう

に記述するかを以下に説明します。

ORACLE 関数 Oracle SQL Server

ADD_MONTHS SELECT --3ヶ月後を取得

ADD_MONTHS ('2009/12/01', 3) AS

MEMO

FROM

DUAL

SELECT --3 ヶ月後を取得 (注: 時分秒まで取

得)

DATEADD (month, 3, '2009/12/01')

CASE SELECT

CASE

WHEN 1 = 1 THEN 'True'

ELSE 'False'

END AS MEMO

SELECT

CASE

WHEN 1 = 1 THEN 'True'

ELSE 'False'

END AS MEMO

Page 35: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

35

FROM

DUAL

CEIL SELECT

CEIL (VAL) AS MEMO

FROM

DUAL

SELECT

CEILING (VAL) AS MEMO

DECODE SELECT

DECODE ( SEX,

'1', '男',

'2', '女',

'不明'

) AS SEIBETSU

FROM

TBL_DANJO

CASE 関数に変更します。

SELECT

CASE SEX

WHEN '1' THEN '男'

WHEN '2' THEN '女'

ELSE '不明'

END AS SEIBETSU

FROM

TBL_DANJO

ORACLE の DECODE 関数は短絡評価 (真となる条

件に一致したら、それ以降の条件判断は行わない)

ですが、CASE 関数は短絡評価ではありません。短

絡評価を利用した DECODE 関数を CASE 関数に変

更する場合は注意が必要です。

REPLACE SELECT

REPLACE ('ABC','B','★') AS MEMO

FROM

DUAL

SELECT

REPLACE ('ABC','B','★') AS MEMO

LENGTHB SELECT

LENGTHB ('あいう') AS MEMO

FROM

DUAL

SELECT

DATALENGTH ('あいう') AS MEMO

LENGTH SELECT

LENGTH ('あいう') AS MEMO

FROM

DUAL

SELECT

LEN ('あいう') AS MEMO

TRIM

LTRIM

RTRIM

SELECT -- TRIMで前後の空白を除去

TRIM (' あいう ') AS MEMO

FROM

DUAL

SELECT --LTRIMと RTRIMで前後の空白を除去

RTRIM (LTRIM (' あいう ') ) AS MEMO

FROM

DUAL

ROUND SELECT --小数第一位を丸める SELECT --小数第一位を丸める

Page 36: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

36

ROUND ( 123.45 , 1 ) --結果は

123.5

FROM

DUAL

ROUND ( 123.45 , 1 ) --結果は 123.50

SUBSTR SELECT --結果は「うえ」

SUBSTR ('あいうえお', 3, 2) AS MEMO

FROM

DUAL

SELECT --結果は「うえ」

SUBSTRING ('あいうえお', 3, 2) AS MEMO

LPAD

RPAD

SELECT --左側をゼロ パディングする

LPAD ('123' , 5 , '0') AS MEMO

FROM

DUAL

SELECT --左側をゼロ パディングする

RIGHT ('00000' + '123' , 5) AS MEMO

※'00000' + '123' の結果「'00000123'」の右

から 5 文字を取り出す。取り出される結果は

「'00123'」。

TRUNC SELECT --千の位で切捨て。結果は「12000」

TRUNC (12345, -3) AS MEMO

FROM

DUAL

該当関数なし。以下の対応方法で実装可能。

SELECT --結果は 12000

CAST (12789 / 1000 AS INT) * 1000 AS

MEMO

※ROUND 関数を以下のように使用すると結果が

「13000」になるため、CAST を使用して千の位で

切り捨てを行っている。

SELECT --結果は 13000

ROUND (12789, -3) AS MEMO

NVL SELECT

NVL (NULL,'NULLです') AS MEMO

FROM

DUAL

SELECT

ISNULL (NULL,'NULLです') AS MEMO

TO_CHAR SELECT

TO_CHAR (10) AS MEMO

FROM

DUAL

SELECT --どちらも可能

CONVERT (CHAR, 10) AS MEMO,

CAST (10 AS CHAR) AS MEMO2

MOD SELECT

MOD (12, 5) AS MEMO -- 結果

は 2

FROM

SELECT 12 % 5 AS MEMO -- 結果は 2

Page 37: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

37

DUAL

GREATEST SELECT --結果は「9」

GREATEST ( 1, 2, 3, 5, 9 ) AS MEMO

FROM

DUAL

該当関数なし。以下の対応方法で実装可能。

SQLCLR を使用して GREATEST 関数 と同等の

I/F を持つストアド ファンクションを作成し、

SQL 文からこれを呼び出す。

LEAST SELECT --結果は「1」

LEAST ( 1, 2, 3, 5, 9 ) AS MEMO

FROM

DUAL

該当関数なし。以下の対応方法で実装可能。

SQLCLR を使用して LEAST 関数 と同等の I/F

を持つストアドファンクションを作成し、SQL 文

からこれを呼び出す。

SYSDATE --結果は「2009/12/09 19:00:00」

SELECT

SYSDATE AS MEMO

FROM

DUAL

--結果は「2009-12-09 19:42:00.593」

SELECT

GETDATE () AS MEMO

4.4 ORACLE 特有の機能を含んだ SQL

ORACLE を使用する際によく利用されると思われる ORACLE 固有の機能を、SQL Server でどのように実装

するかを以下に示します。

操作 Oracle SQL Server

一時表 ORACLE には以下 2 通りの一時表がありま

す。

(1) セッション内で有効な一時表

CREATE GLOBAL TEMPORARY TABLE

<<TMP_テーブル名>>

(列名 1 データ型,

列名 2 データ型,

:

)

ON COMMIT PRESERVE ROWS

SQL Server に移行する場合は、以下の方法で対応

します。

(1) セッション内で有効な一時表 (ローカル一

時テーブル)

<使用例> 一時テーブルを作成する

SELECT

*

INTO

#<<TMP_テーブル名>> --先頭に # を付ける

FROM

<<テーブル名>>

又は明示的に CREATE TABLE することもできま

す。

Page 38: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

38

(2) トランザクション内で有効な一時表

CREATE GLOBAL TEMPORARY TABLE

<<TMP_テーブル名>>

(列名 1 データ型,

列名 2 データ型,

:

)

ON COMMIT PRESERVE ROWS

CREATE TABLE #<<TMP_テーブル名>> (

列名 1 , 列名 2 ...

)

注意:ORACLE の場合、セッション終了時に一時表

の「データだけがクリア」されますが、SQL SERVER

の場合は、#TMP_テーブル名 の「テーブル定義その

ものが DROP される」という違いがあります。

(2) トランザクション内で有効な一時表

ORACLE のトランザクション内で有効な一時表

(CREATE GLOBAL TEMPORARY TABLE .. ON

COMMIT DELETE ROWS) に相当する機能は SQL

Server の標準機能にはありません。上記のように

ローカル一時テーブルを作成し、アプリ側でトラン

ザクションを COMMIT した後、ローカル一時テー

ブルを TRUNCATE する方法で対応します。

(3) グローバル一時テーブル

SQL SERVER 固有の機能です。ORACLE には無い

機能です。##<TMP_テーブル> のように、テーブル

名の先頭に ## を付与します。 (1) のローカル一

時テーブルと同じ方法で作成できます。ローカル一

時テーブルとの違いは「複数のセッションから利用

できる」という点です (複数のアプリから共有メモ

リを参照するというイメージに近いです) 。全ての

セッションから参照されなくなると自動的にテーブ

ルがクリア (削除) されます。

自律型トランザ

クション

アプリケーションのトランザクション内で、

そのトランザクションとは独立したトランザ

クション処理を行うことができます。

利用用途として例を挙げると、アプリケーシ

ョンの監査ログをアプリの正常/異常終了に

関係なく、監査ログ テーブルに出力する場合

SQL SERVER には 標準機能として自律型トランザ

クション に相当する機能は存在しません。SQL

Server には Oracle の自律型トランザクション

に該当する機能は存在しません。

Page 39: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

39

などがあります。

ORACLE では以下のように使用します。

/*「自立型トランザクション (例: ログ出

力) のプロシージャを作成。アプリのトラン

ザクション内から呼び出す */

CREATE OR REPLACE PROCEDURE

xxx.WriteLOG (

pECODE IN NUMBER,

pEMSG IN VARCHAR2

)

IS

PRAGMA AUTONOMOUS_TRANSACTION;

--自律型トランザクション

BEGIN

INSERT INTO LOGTBL VALUES

(pECODE, pEMSG) ;

COMMIT;

END;

--アプリから上記プロシージャを呼び出す。

CREATE OR REPLACE PROCEDURE

xxx.Application_XYZ

IS

BEGIN

EXECUTE IMMEDIATE 'INSERT INTO

BAD_TABLE VALUES (NULL) ';

--エラーが発生、EXCEPTIONへジャンプ。

COMMIT;

EXCEPTION

WHEN OTHERS THEN

DBMS_OUTPUT.PUT_LINE ('エラー発

生:' || SQLCODE || ':' || SQLERRM) ;

--アプリとは異なるトランザクション

で処理されるため、

--WriteLOG で INSERT された内容

はロールバックされない。

<対応方法>

Oracle で自律型トランザクションが設定されて

いるオブジェクトは、SQL Server に移行するにあ

たり複数のオブジェクトに分割し、それぞれ別のト

ランザクションとして呼び出す必要があります。

CREATE PROCEDURE xxx.WriteLOG

@pECODE int,@pEMSG nvarchar (50)

AS

BEGIN TRANSACTION;

INSERT INTO LOGTBL VALUES (@pECODE,

@pEMSG) ;

COMMIT;

GO

CREATE PROCEDURE xxx.Application_XYZ

AS

BEGIN TRANSACTION

BEGIN TRY

--エラーが発生、EXCEPTIONへジャンプ。

END TRY

BEGIN CATCH

ROLLBACK

EXEC WriteLOG 1,N'ERROR OCCURED'

END CATCH

IF @@TRANCOUNT>0 COMMIT

GO

Page 40: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

40

WriteLOG (SQLCODE, 'INSERT

ERROR') ;

ROLLBACK;

END;

正規表現 <ORACLE 10g 以降>

以下の正規表現 (関数) が使用できます。

REGEXP_LIKE 関数

REGEXP_REPLACE 関数

REGEXP_INSTR 関数

REGEXP_SUBSTR 関数

SQL Server では、大きく分けて 2 つの対応方法

があります。

(1) LIKE を使用する

SQL SERVER では、比較的単純なパターン マッチ

ングであれば LIKE を使用したパターン マッチン

グが行えます (後述) 。

(2) SQLCLR として実装する。

正規表現の全ての機能を使用する場合は、SQL

SERVER の機能である SQLCLR を使用して「正規

表現の機能を実装したストアド プロシージャを作

成」することができます。これを利用することで

SQL 文 から正規表現の機能を使用することができ

ます (正規表現以外にも様々な処理を SQLCLR と

して作成できます)

LIKE を使用したパターン マッチング

SQL SERVER では 一般的な LIKE 演算子で使用

される % や _ (アンダー スコア) 以外に正規表

現の文字集合 ( [] ) に類似したパターン マッチ

ングが行えます。

<記述方法>

xxx LIKE '[abc]zz%' -- azz、bzz、czz で

始まる文字列にマッチ

xxx LIKE '[^x]%' -- x以外の文字で始ま

る文字列にマッチ

<使用例>

SELECT

* -- 抽出結果は 3 件 (斉藤, 佐藤, 獅子

Page 41: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

41

籐)

FROM

--------------------

(SELECT '斉藤' AS Name --

斉藤

UNION ALL SELECT '佐藤' AS Name -- 佐

UNION ALL SELECT '獅子籐' AS Name -- 獅

子籐

UNION ALL SELECT '本田' AS Name

) TMP

WHERE

Name LIKE '%[^田]'

フラッシュバッ

ク クエリ

過去のある時点のデータを取得できます。

操作ミスなど、データを誤って削除した場合、

削除される前のデータを取得できるので、こ

れを使用してデータを復旧する場合などに使

用されます。

<例>

今から 5 分前に TBL_A のデータを誤って

全て削除してしまった。削除前のデータを復

旧するために、今から 10 分前の TBL_A の

データ (状態) を取得する。

SELECT * FROM TBL_A

AS OF timestamp (

systimestamp - interval '10'

minute)

標準機能でこれに該当する機能はありませんが、こ

れに類似する機能として「変更データ キャプチャ」

機能があります。

変更データ キャプチャは、SQL Server のテーブ

ルに対して適用された挿入、更新、削除の各操作を

記録・保存します。この機能を使用する際は、事前

にこの機能を有効化しておく必要があります。

マルチレコード

インサート

ORACLE では INSERT ALL~、 INSERT

FIRST~ を使用して複数のテーブルへ

INSERT できます。

<例 1> 定数をもとに複数レコードを同一テ

ーブルへ INSERT する。

INSERT ALL

ORACLE では INSERT ALL~、INSERT FIRST~

を使用して複数のテーブルへ INSERT できます。

<例 1> 定数をもとに複数レコードを同一テーブル

へ INSERT する。

INSERT

Page 42: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

42

INTO TBL_A (aa, bb) values (1, 2)

INTO TBL_A (aa, bb) values (3, 4)

SELECT * FROM DUAL --これはダミー

<例 2>あるテーブルの値を判断、条件により

複数テーブルへ INSERT

INSERT ALL

WHEN EMP_TBL.SEX = '1' then

INTO TBL_01

WHEN EMP_TBL.SEX = '2' then

INTO TBL_02

SELECT * FROM EMP_TBL

INTO TBL_A (aa, bb) Values (1,2) ,

(3,4)

ORACLE のように 1 つの SQL 文で複数のテーブ

ルへ INSERT する機能はありません。

これを行う場合は、INSERT するテーブル単位に

INSERT 文を使用します。

INSERT INTO TBL_01

SELECT * FROM WHEN EMP_TBL.SEX = '1'

INSERT INTO TBL_02

SELECT * FROM WHEN EMP_TBL.SEX = '2'

ROUNUM --最初に 降順 にデータを並び替えてから

--ROWNUM で順序を付与する。

SELECT

ROWNUM AS SEQNO,

TMP_TBL.*

FROM

(SELECT

TMP_TBL.*

FROM

(SELECT 'AAA' AS PK

UNION ALL SELECT 'BBB' AS PK

FROM DUAL

UNION ALL SELECT 'CCC' AS PK

FROM DUAL

) TMP_TBL

ORDER BY

PK DESC

) TMP

SELECT

ROW_NUMBER () OVER (ORDER BY PK DESC)

AS SEQNO,

TMP_TBL.*

FROM

(SELECT 'AAA' AS PK

UNION ALL SELECT 'BBB' AS PK

UNION ALL SELECT 'CCC' AS PK

) TMP_TBL

ROWNUM PK

-------------------- ----

1 CCC

2 BBB

3 AAA

ROWID データ行の位置を特定する内部形式の値を取

得する機能です。

データ行の位置を特定できるため、ROWIDを

使用して UPDATE を行うことができます。

SQL Server ではこれに該当する標準機能はあり

ません。テーブルを作成する際に ROWID という名

前のデータ項目を IDENTITY 型 などでテーブル

項目として定義する方法が考えられます。また、

ROWID が条件句に使用されている場合は、プライマ

リキーに変換することで Oracle と同等の結果を

取得することができます。

Page 43: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

43

データベース

リンク

オラクルでは以下のようにデータベース リ

ンクを作成します。

CREAT DATABASE LINK HokkaidoSV

CONNECT TO USR01

IDENTIFIED BY PASSWORD

USING 'ORACLE_SERVER'

データベースリンクを使用する場合

SELECT * FROM USR01.TBL_A@HokkaidoSV

SQL Server では リンク サーバー と呼ばれる機

能が

ORACLE のリンク サーバーに相当します。以下の

ように作成します。

EXEC sp_addlinkedserver

'HokkaidoSV',

N'SQL Server'

USING 'ORACLE_SERVER'

データベースリンクを使用する場合

SELECT * FROM

HokkaidoSV.USR01.dbo.TBL_A

和暦変換 --和暦日付を取得する

SELECT

TO_CHAR (SYSDATE,'eeyy/mm/dd',

'nls_calendar = ''Japanese

Imperial'''

) AS MEMO

FROM

DUAL

SQL Server には標準機能で和暦変換機能はあり

ません。

SQL CLR、又は SQL Server のストアド ファン

クション (関数) を利用して 和暦変換関数 を

作成して対応する必要があります。

ランダム値 ストアド パッケージを呼び出してランダム

値を取得します。

SELECT

DBMS_RANDOM.RANDOM () AS MEMO

FROM

DUAL

RAND 関数を使用してランダム値を生成できます。

SELECT

RAND () AS MEMO

MERGE文 既に更新対象のデータが存在する場合は

UPDATE と、存在しない場合は INSERT を

行います。

MERGE INTO TBL_A A

USING TBL_B B

ON (A.PK = B.PK)

WHEN MATCHED THEN

UPDATE SET A.ITEM = 'UPD'

WHEN NOT MATCHED THEN

INSERT (ITEM) VALUES ('INS')

SQL Server でも MERGE 文 を使用できます。

MERGE INTO TBL_A A

USING TBL_B B

ON (A.PK = B.PK)

WHEN MATCHED THEN

UPDATE SET A.ITEM = 'UPD'

WHEN NOT MATCHED THEN

INSERT (ITEM) VALUES ('INS')

動的 SQL ネイティブの動的 SQL 実行は以下で行いま ORACLE のネイティブ実行に相当する機能は以下

Page 44: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

44

す。

DECLARE

BEGIN

EXECUTE IMMEDIATE 'DROP TABLE

TBL_A';

END;

※他に DBMS_SQL パッケージ を使用した動

的 SQLの実行が可能です。

となります。

EXEC (' DROP TABLE TBL_A ')

※他に sp_executesql を使用した動的 SQL の実

行も可能です (ORACLE の DBMS_SQL パッケージ

に相当します) 。

ファイル入出力 ORACLE では UTL_FILE パッケージ を使

用して、ファイルの入出力を行うことができ

ます。

ORALCE の左記の機能について、SQL Server 標

準機能ではサポートされている機能はありません。

しかし、SQLCLR を使用してユーザーがファイル出

力機能を作成することで対応することができます。

Page 45: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

45

5. データの移行

5.1 移行方式概要

Oracle から SQL Server へデータを移行する方式は、大別して、直接データ移行とファイルを経由する間接

データ移行の、2 つの方式が考えられます。

データ移行元、先の両サーバーが同時に使用できない、WAN を経由する、ネットワーク セグメントが異な

り直接やり取りができないなどネットワークを介さないでデータを移行したい場合は、間接データ移行を行

います。両サーバーが利用でき、ネットワーク経由でデータが移動できる場合は、直接データ移行を行いま

す。

Oracle から SQL Server へデータを移行する場合、その多くはサーバー リプレースやシステム更改時に同一

拠点・LAN 内で移行が行われるため、主に直接データ移行が使われます。

1) 直接データ移行

2) 間接データ移行

直接/間接データ移行のメリットデメリット

直接データ移行 間接データ移行

メ リ ッ

・ Oracle から SQL Server へ直接データを移行で

きるため、間接データ移行と比較すると IO を

抑えることができる

・ TOTAL の作業時間を抑えることができる

・ エクスポート、インポートいずれかの作業を行

っているデータベースが稼働していれば作業

は行える

・ 外部媒体にデータを移し搬送するなど、ネット

ワークを介さないデータの移動手段がとれる

・ Oracle クライアントを移行先サーバーにイン

ストールする必要がない

デ メ リ

ット

・ 両データベースがダウンしているとデータが

移行できない

・ データ量が多くなると、ネットワークに対する

負荷が高くなるため、作業時間やデータの送信

量などを調整する必要がある

・ Oracle クライアントを移行先サーバーにイン

ストールする必要がある

・ エクスポート時のファイル出力、インポート時

のファイルからの入力を行う分、直接データ移

行と比較すると IO が多くなる

・ TOTAL の作業時間が長くなりがち

5.2 直接データ移行

データを直接移行する場合は、次に記載する 4 つの方式が考えられます。

これらは要件に合わせて各移行方式を選択することになりますが、一般的には、データ移行は継続した運用

ではないことや本番環境へ一時的に設定を行うことはさせないこと、データ変換の柔軟性、開発期間と工数

などを考慮して、Integration Service パッケージ (IS パッケージ) による移行を選択することになります。

Page 46: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

46

業務要件に沿った複雑なデータ変換を性能面も考慮しながら移行する場合は、高コストとなっても独自アプ

リケーションを作成して対応する場合があります。

1) Integration Service パッケージによる直接データ移行

2) 独自アプリケーションを作成する直接データ移行

3) Oracle をパブリッシャをとしたレプリケーションを利用する直接データ移行

4) リンク サーバーなど分散クエリを利用する直接データ移行

直接データ移行 各方式の特徴

方式1 方式2 方式3 方式4

データ型やデータ内

容の変換

IS パッケージのデー

タ フロータスク内で

指定可能

アプリケーションの

作りで自由変換

フィルタをかける際

にクエリで行える範

囲で可能

クエリ実行時にクエ

リで行える範囲で可

ワークフローを考慮

したデータ移行

IS パッケージ内で定

義可能

アプリケーションの

作りで自由に定義

不可能 クエリの順番程度で

あればバッチ内で指

定可能

実行方式 パッケージをジョブ

管理ツールから実行

アプリケーションを

ジョブ管理ツールか

ら実行

レプリケーション設

クエリを発行するバ

ッチを作成し、ジョブ

管理ツールから実行

エラー ハンドリン

IS パッケージログ アプリケーションの

作りで自由記録

レプリケーション モ

ニタのエラー

コマンド エラーをテ

キスト出力

データ移行後に発生

した差分の吸収、ま

たは連続データ移行

データの制止点やロ

ック制御の問題があ

るため困難

データの制止点やロ

ック制御の問題があ

るため困難

連続して差分データ

を転送できるため容

データの制止点やロ

ック制御の問題があ

るため困難

移行時のサービス停

データの差分を発生

させないために必要

データの差分を発生

させないために必要

不要 データの差分を発生

させないために必要

設定の追加

不要 不要 レプリケーション設

定を作成、移行後は削

リンクを設定、移行後

は削除

開発の容易さ、工数 IS パッケージの開発

となるため、多少の期

間と工数が必要とな

専用ツールの開発と

なるため、それなりの

期間と工数が必要と

なる

設定のみとなるため、

容易でかつ少ない工

数で実装可能

クエリ実行用のバッ

チを作成するため、容

易でかつ少ない工数

で実装可能

Page 47: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

47

5.3 間接データ移行

間接データ移行はエクスポート元とインポート先でファイルを利用した以下の流れで作業を行います。

データ移行を行う際に、移行先サーバーに追加の Oracle クライアントソフトをインストールできないなど

の要件がある場合、ファイルの代わりに一時的に両ソフトが入った移行用サーバーを立てることを検討する

場合がありますが、この方法は直接データ移行、間接データ移行、両移行方式のデメリットが発生する上に

追加サーバーを用意するコストが発生するため、推奨しません。

① PL/SQL や exp コマンド、サードベンダー殿ツール、Integration Service などを使用し、データをファ

イルへエクスポート

② テキスト ファイル、EXCEL、Access などエクスポートされたファイルを移行元サーバーから移行先サ

ーバーへコピー、必要に応じてデータ変換

③ BCP/BulkInsert/Integration Service などを使用し、ファイルからデータをインポート

5.4 Integration Service による直接データ移行

SQL Server に付属の Integration Service を利用することで、Oracle に直接接続を行い、クエリを発行してデ

ータを取得することができます。また、Integration Service ではデータフローを定義することで、データ移

行に伴うデータの変換も同時に行い、変換されたデータを直接 SQL Server に投入することも可能です。

5.4.1 パッケージの作成

① Oracle への接続

Integration Service で Oracle に接続するには、移行先のサーバーに Oracle クライアントをインストールし、

「ネイティブ OLE DB」に含まれる「Oracle Provider for OLE DB」または「Microsoft OLE DB Provider for Oracle」

プロバイダを利用します。プロバイダについては、接続する Oracle のバージョンや移行先となる SQL Server

のエディション (x86/x64/IA64) によりサポート範囲が異なりますので、各環境でサポートされているバー

ジョンを確認したうえで選択します。なお、「Microsoft OLE DB Provider for Oracle」には 64bit 版は存在し

ません。64 bit 環境の場合は、「Microsoft Connector for Oracle by Attunity」を導入してください。

「OLE DB ソース」コンポーネントで Oracle に接続するには、事前にローカルネットサービス名の設定を行

っておく必要があります。ローカルネット サービス名で設定したホスト名を「サーバー名」欄に入力します。

Page 48: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

48

図 5.4.1-① Oracle への接続設定例

② SQL Server への接続

出力先として SQL Server を指定する際は、「ネイティブ OLE DB」に含まれる「SQL Server Native Client」プ

ロバイダを指定します。

図 5.4.1-② SQL Server への接続設定例

③ 単純移行

データを移行するテーブル構造が Oracle と SQL Server で同じ場合は、データソースと変換先を直接つなぐ

ことで、相互のテーブル間で単純にデータを移行することが可能です。この場合は、テーブルごとに「OLE DB

ソース」コンポーネントを作成し、対になる「OLE DB 変換先」を指定し、直接接続を繋げ、項目を合わせ

ます。

この方法を使用する場合は、項目の順番変更や項目を削るなど、クエリで指定できる変更程度であればデー

タ変換が可能となります。

「ネイティブ OLE DB¥Microsoft

OLE DB Provider for Oracle」を選択

ローカルネットサービス名で設定した

名前を指定 移行する全てのデータが参照可能なユ

ーザー名とパスワードを利用

「ネイティブ OLE DB¥SQL Server

Native Client 11.0」を選択

・ サーバー名¥インスタンス名を指定

・ 別名を設定している場合は、設定可能

・ 通常は移行先サーバーでパッケージを

実行させるため、ローカルサーバーのイン

スタンスを指定することになる

・ 通常は Windows 認証を利用して管

理者権限を持つユーザーで実行させる

・ SQL 認証を利用している場合は、パ

ッケージを本番環境にコピーした際に

パスワードを再設定する

移行先のユーザーデータベースを指定

Page 49: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

49

図 5.4.1-③ データの単純変換例

④ データ変換を伴う移行

Oracle と SQL Server のテーブルに構造的な違いがある場合、データ型やデータ内容に変換の必要がある場

合、データフロータスク内の変換コンポーネントを利用することで、データ変換が行えます。また、「スクリ

プト コンポーネント」を利用することで、定義されている変換以外の変換も可能となります。

図 5.4.1-④ データ フローで利用できる各種変換コンポーネント

⑤ インポート・エクスポートウィザード

Management Studio のインポート・エクスポートウィザードを使用することでも、データ移行用の IS パッ

ケージを作成することも可能です。

インポート・エクスポート ウィザードを使用すると、SQL Server にテーブルが作成されていない場合、デ

ータ移行前にテーブルを作成します。ただし、このテーブル定義は、SQL Server に適したデータ型で定義さ

れていないことや、データ変換が正常に行われないケースではエラーが発生することがあるので、極力テー

ブルを事前に作成し、データのみ移動するようにします。

Page 50: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

50

図 5.4.1-⑤ インポート・エクスポート ウィザードで作成されたパッケージ例

5.4.2 データ移行時の注意点

Oracle から SQL Server へデータを移行する際の代表的な注意点を次に示します。

OS の違いや文字コードの違いなど移行前後の環境によって文字化けが生じることがありますので、デ

ータ移行前には環境に合わせて文字化けする文字を洗い出しておきます。

Oracle の NUMBER 型は桁を指定しないでテーブルを作成することができます。このようなデータ型

があると移行先の SQL Server のテーブルでデータ型が定義できません。事前にデータ内容を洗い出し、

全てのデータが問題なく収まるよう適切なデータ型を指定するようにします。

Oracle の NUMBER 型を SQL Server にそのまま変換しようとすると、Decimal 型を指定する必要があ

ります。しかし、数値データを Decimal 型で全て定義すると、データサイズや性能面で好ましくない

結果を生みます。数値データのデータタイプは SQL Server 側で見直しておく必要があります。

データベースオプションの違いに注意します。NULL の扱いは特に Oracle と SQL Server でソート結

果の違いや比較の違いとして現れてきます。

親子の関連付けがあるテーブルは、親から子と言った順でデータを投入します。物理的に外部制約を設

定する必要がある場合は、データ移行後全てのチェックが終了した後に設定することを検討します。

トランザクション ログの排出量、バックアップ、バッチサイズのバランスが崩れるとトランザクショ

ン ログ ファイルの使用率がフルとなり、処理がエラーとなります。エラー時や再実行、性能などを考

慮して、データ移行中はリカバリモデルを「シンプル」や「一括ログ」に変更することを検討しておき

ます。

複数テーブルへのデータ移行を並行して実行する場合は、CPU 負荷やログの排出量が想定以上になら

ないよう注意します。

データ移行の性能を考慮して、インデックスを残したまま移行するか、一度削除してから移行し、デー

タが全て投入できた段階で再度インデックスを作成するかを検討します。なお、インデックスを残して

データを移行した場合は、データ移行後にインデックスの再構築または再構成と統計情報の更新を忘れ

ずに行います。

Page 51: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

51

IS パッケージでデータ変換を行う場合は、作りにより性能が大きく異なります。ワークフローやデー

タ変換が複雑になるとその分処理が遅くなりますので、極力シンプルなデータ移行となるようパッケー

ジを作成します。

IS パッケージは SQL Server 側のデータベース サーバーで実行します。IS パッケージの実行を第三の

サーバーで行えるよう、第三のサーバーに Integration Service をインストールすると、追加ライセン

スが必要となります。また、第三のサーバーで Integration Service を実行すると、データは移行元か

ら第三のサーバーを経由して移行先へ流れるため、不要な IO を発生させることとなります。

UNIQUE 制約、一意キーの列に複数の NULL データを格納することはできません。 (Oracle では可能)

NULL データが複数ある場合は、制約の解除や、NULL 値に対する一意性のある値の設定などを検討す

る必要があります。

Oracle では空文字列と NULL を同じ値として扱います。IS NULL の結果に差異が出るなどの影響があ

りますので、NULL を意識する必要がある移行には注意が必要です。

Page 52: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

52

補足 A. SQL Server Migration Assistant for Oracle (SSMA)

A1 SQL Server Migration Assistant for Oracle (SSMA)

SQL Server Migration Assistant for Oracle (SSMA) は、Oracle データベースから SQL Server 2012 データベ

ースへの移行を支援するツールで、テーブルやインデックスなどの定義はもちろん、パッケージやプロシー

ジャなどの PL/SQL も SQL Server の Transact-SQL に変換し SQL Server に適用することが可能です。

また、変換後に作成される評価レポートで、SSMA で変換できない箇所のチェックや、移行作業にかかる作

業ボリュームも確認することができます。

さらに、SSMA Extension Pack と呼ばれる拡張パッケージをインストールすることにより、SQL Server には

ない Oracle Database の関数や機能などがエミュレートした関数として生成され、SSMA で変換した時に自

動で適用されるようになります。

SSMA は、マイクロソフトのホームページからダウンロードすることができます。2013 年 4 月時点では、SQL

Server 2012 に対応した v5.2 が最新になります。

http://www.microsoft.com/en-us/download/details.aspx?id=28766

A.1.1 SSMA 5.2 のシステム要件

サポート OS:Windows 7、Windows Server 2003、Windows Server 2008、Windows Server 2008 R2、Windows

Vista、Windows XP、Windows 2012

Oracle クライアントの要件:

Microsoft Windows Installer 3.1 かそれ以降

Microsoft .NET Framework version 2.0 かそれ以降

Oracle Client 8.1.7 かそれ以降

SSMA for Oracle Extension Pack の要件:

SQL Server 2005 かそれ以降

Microsoft Windows Installer 3.1 かそれ以降

Oracle Client 8.1.7 かそれ以降

Page 53: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

53

A.1.2 SSMA 5.2 のインストール

ここでは、SSMA 5.2 を SQL Server 2012 にインストールする手順について説明します。

ダウンロード先からダウンロードした圧縮ファイルを解凍後、インストーラー (SSMA for Oracle 5.2.exe) を

ダブルクリックします。

1. インストール開始

インストーラーをダブルクリックすると、インストール開始画面が起動します。[Next] をクリック

して次に進みます。

2. 使用許諾契約の確認

使用許諾契約の内容を確認後、[I accept the agreement] (同意する) を選択して[Next] をクリックし

ます。

Page 54: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

54

3. 利用レポートの送信確認

利用レポートを自動的に送信する場合はチェックボックスをチェックします。ここでは、そのまま

[Next] をクリックします。

4. セットアップタイプの選択

セットアップタイプを選択します。ここでは、[Typical] を選択して [Next] をクリックします。

Page 55: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

55

5. インストール開始

問題なければ、[Install]をクリックしてインストールを開始します。

6. インストール完了

正常にインストールが完了すれば、上記画面が表示されます。[Finish]をクリックしてインストール

を終了します。

Page 56: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

56

導入時の注意点

SSMA は Case-Sensitive (大文字・小文字を区別する ) な照合順序に対応していないため、

Japanese_XJIS_100_BIN2 などの照合順序を使用している場合、SSMA のインストール時に下記のエ

ラーが発生します。

回避策は以下の 2 つです。

Case-Insensitive な照合順序の SQL Server Database を使用する.

例) Japanse_XJIS_CI_AS など

以下手順を実施する

1.大文字小文字を区別しない照合順序のデータベースに SSMA を使って移行する

(Japanese_XJIS_100_CI_AI など)

2.SSMA による移行が完了したら、 SQL Server Management Studio を使って全ての

スキーマ定義情報を取得する

3.2 で取得したスキーマ定義を基に全てのインデックス、制約を削除する

4.2 で取得したスキーマ定義を基に「全テーブル照合順序変更」スクリプトを作成する

5.4 で作成したスクリプトを実行して照合順序を Japanese_XJIS_100_BIN2 に変更する

6.2 で取得しておいたスキーマ定義を流し込んでインデックス、制約を再作成する

参考情報

You are not able to migrate your Oracle or Sybase databases to a case-sensitive SQL Server database using SSMA http://support.microsoft.com/kb/2020715

Page 57: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

57

A.1.3 SSMA Extension Pack のインストール

ここでは、SSMA Extension Pack を SQL Server 2012 にインストールする手順について説明します。

1. 拡張パッケージのインストール先を選択

拡張パックをインストールするインスタンスを選択して [Next] をクリックします。

2. 接続先の設定

SQL Server に接続する為のポートと認証方法を選択します。ここでは、ポートにデフォルト

(default) 、認証方法に [Windows Authentication] を選択して [Next] をクリックします。

Page 58: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

58

3. データベース マスターキーの入力

SQL Server に作成される拡張パッケージ用データベースのマスターキーのパスワードを指定します。

4. インストールの確認

インストールを続行する場合、[Install Utilities Database v5.2.1259 and Install Extension Pack libraries]

を選択後、[Next] をクリックします。変換されたコードをチェックする場合は、

[Install Tester Database] をチェックしてテスターデータベース (ssmatesterdb) を作成します。

Page 59: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

59

5. インストール中の画面

拡張パッケージがインストールされます。インストールが完了するまで待ちます。

6. インストールの完了

正常にインストールが完了すると、他のインスタンスに拡張パッケージをインストールするかどう

かの確認画面が表示されます。ここでは、[いいえ (N) ] をクリックしてインストールを終了します。

Page 60: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

60

7. 拡張パッケージをインストールするインスタンスを選択

正常にインストールが完了すれば、上記画面が表示されます。[Finish]をクリックしてインストール

を終了します。

Page 61: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

61

A.1.4 SSMA の起動

インストールが完了したら、実際に SSMA を使用してみます。SSMA を使用するにはライセンスキーを取得

する必要があります。

1. SSMA の起動

デスクトップ上に作成された、[Microsoft SQL Server Migratio…] をダブルクリックして、

SSMA を起動します。

2. ライセンスキーの取得

ライセンスキーがない場合、License Management の画面から [license registration page] をクリッ

クしてライセンス登録画面を起動します。ライセンスキーがある場合、この手順の 6 まで進んで下

さい。

3. サインイン

Page 62: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

62

Microsoft アカウントをお持ちの場合、アカウントとパスワードを入力してサインインします。

Microsoft アカウントをお持ちではない場合、Sign up now をクリックしてアカウントを登録します。

4. SSMA のライセンス登録

ログイン後表示される画面に必要な情報を入力して登録を完了します。登録後、ライセンス ファイ

ルがダウンロード画面が出力されますので、ライセンス ファイルをライセンス ディレクトリに指

定されたディレクトリにダウンロードします。

Page 63: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

63

5. ライセンス ファイルのダウンロード完了

ライセンスファイルのダウンロード完了後、上記メッセージが表示されます。[OK] をクリックして

ダウンロードを完了します。

6. ライセンスキーの適用

[License directory] にライセンス ファイルが配置されていることを確認し、[Refresh License] をクリ

ックしてライセンスキーを適用します。

Page 64: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

64

7. 初期画面の起動

ライセンス適用すると、SSMA の初期画面が起動します。

Page 65: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

65

A.1.5 プロジェクトの作成

プロジェクトを作成します。

1. プロジェクトの作成

[file]-[New project] を選択し、プロジェクト作成を開始します。Name にはプロジェクト名、Location

にはプロジェクトの配置場所、Migrate To は移行先の SQL Server のバージョンを選択します。こ

こではデフォルトの値のまま[OK]をクリックします。

2. Oracle への接続設定

[Connect to Oracle] をクリックして、Oracle への接続設定を開始します。

Page 66: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

66

3. 使用許諾契約の確認

[Server name] に Oracle がインストールされているサーバー名、[Server port] にポート番号、

[Oracle SID] に Oracle のインスタンス名、[User name] には Oracle のユーザー名、[Password] に

パスワードを入力し [Connect] をクリックします。

4. 接続完了

接続が正常に完了すると、[Oracle Metadata Explorer] に指定したサーバー名が表示されます。

Page 67: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

67

A.1.6 レポートの作成

レポートを作成します。レポート作成のみであれば、 SQL Server に接続する必要はありません。

1. プロジェクトの作成

[Oracle Metadata Explorer] に表示されたスキーマから、評価したいスキーマを選択して、

[Create Report] をクリックします。

2. Oracle の分析

レポート作成が開始されると、[Output] にステータスが表示されます。レポート作成が完了するま

で待ちます。

3. レポートの表示

レポート作成が完了すると、レポートのトップ画面が表示されます。

Page 68: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

68

A.1.7 レポートの見方

作成されたレポートでは、Oracle のスキーマを SQL Server に変換した時の評価を確認することができます。

レポート画面

① Conversion Statistics ② Objects by categories

③ Objects by categories

Page 69: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

69

① Conversion Statistics

Conversion Statistics は、引数、戻り値、SELECT ステートメントなどの変換率が表示されます。

ALL は全ての変換率になります。

Page 70: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

70

② Object by categories

オブジェクトの種類毎に SSMA でコンバートした時の変換率を確認することができます。

③ .エラー リスト

SSMA で変換した時にエラーが発生したものを一覧で確認することができます。一覧には、

エラーコードとエラーメッセージが表示されます。括弧内の値はエラーが発生したオブジェク

ト数になります。[estimated manual conversion time] は。手動で変換した場合の変換工数も算

出され、全てのエラーの合計工数が右上の [Total estimated manual conversion time] に算出さ

れます。

Page 71: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

71

レポート画面 ( PL/SQL 選択時)

左の [Source] には Oracle の PL/SQL 、右の [Target] は SQL Server の Transact-SQL にコンバートした時

のものになります。

ボタンをクリックすると、コンバートされなかった箇所にジャンプすることができます。[Target] には

SSMA エラー番号と、エラー メッセージが記載されているので、何故コンバートされなかったを確認する

ことができます。

Page 72: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

72

補足 B.Oracle Migration Assessment について

B.1 Oracle Migration Assessment

本章では、Oracle Migration Assessment を実施した集計結果について説明致します。

Oracle Migration Assessment とは、Oracle Database から SQL Server への具体的な移行費用や方法、運用コ

ストの比較をした、わかりやすいレポートを作成し、お客様にご説明するサービスです。

このサービスでは、実際に稼働しているお客様システムの Oracle Database からテーブルや PL/SQL などの

オブジェクト情報を取得し、SSMA を使用して SQL Server のオブジェクトに移行します。そして、その時

に作成される評価レポート結果をもとに Oracle Database から SQL Server へ移行する時の評価を実施して

います。

2011 年から 2012 年にかけて 33 インスタンスに対してアセスメントを実施しており、本章ではその時の

データを集計した形で記載しております。

Oracle Database から SQL Server に移行をご検討中のお客様のご参考になればと思います。

B.2 Oracle Migration Assessment 集計結果

ここでは、SSMA で移行評価を実施した 33 インスタンスのデータを集計した結果を説明します。

具体的には、以下項目について集計しております。

B.2.1 オブジェクトタイプ毎の自動変換率

B.2.2 オブジェクト毎の移行工数

B.2.1 オブジェクト毎の自動変換率

以下は、SSMA を実行した評価結果をオブジェクトの種類毎に集計した結果になります。

Object Type Total With errors Converted

Collection-types 6 6 0%

Functions 642 144 78%

Indexes 7045 59 99%

Object-types 6 6 0%

Packages 50212 12621 75%

Procedures 1694 703 59%

Schemas 112 62 45%

Sequences 480 0 100%

Synonyms 11688 7365 37%

Tables 18126 2068 89%

Triggers 7233 2559 65%

Views 3677 228 94%

合計 100921 25821 74%

Page 73: 1 データベース オブジェクト移行とデータ移行 (10.2) Oracle Database 11g Release 1 6 3. データベース オブジェクト の移行 3.1 SQL Server の ネーミング

73

パッケージやプロシージャ、関数、トリガーなどの PL/SQL についての変換率が低くなっています。 PL/SQL

でエラーになっている要因としては、DB リンクを使用したテーブルや Invalid のビューなど、不正なテー

ブルを使用した変数を定義している場合が多く見られます。このようなテーブルを使用して変数を定義して

いると、変数自体がエラーになり、その中の全ての処理がエラーになってしまいます。

また、上記数値は、SSMA Extension Pack の関数を使用して変換した結果になります。SSMA Extension Pack

を使用した場合、Oracle Database で DBMS パッケージや SQL Server にはない関数を使用していてもそれ

らをエミュレートして SQL Server のオブジェクトに変換することができます。ですが、SSMA Extension Pack

でエミュレートされた関数は、関数内部で様々な処理を実行している為、大量に実行されたときにパフォー

マンスに影響を及ぼす可能性があります。この為、SSMA Extension Pack を使用して移行した時には、移行

後のパフォーマンスの検証を実施することをお勧め致します。

B.2.2 オブジェクト毎の移行工数

以下は、エラーになったオブジェクトを修正する工数を SSMA が算出した結果を集計したものになります。

対象インスタンス 手動移行時間 (合計) 手動移行時間 (インスタンス毎の平均)

33 インスタンス 65,094 時間 (約 135 人月) 1972.5 時間 (約 4.1 人月)

手動移行時間は、SSMA が自動で算出したもので、エラー毎に定義された時間とエラー件数を算出した概算

値になります。

33 インスタンスの平均は 1972.5 時間で、1 か月 20 日で計算すると約 4.1 人月で移行可能という計算になり

ます。この手動移行時間は、多い環境では 40 人月以上のインスタンスもあれば、少ない環境で 0 人月の環境

もあり、環境によって大きく差があります。

特に、PL/SQL のオブジェクトが多い環境では工数も大きくなる傾向にあります。

以上