Oracle® SQL Developer

MySQLからの移行のための追加情報

リリース3.0

B66847-01(原本部品番号:E18461-03)

2011年3月

このドキュメントでは、MySQLからOracleへの移行について説明しています。『Oracle SQL Developerユーザーズ・ガイド』の移行についての情報を補足しています。

Oracle SQL Developer MySQLからの移行のための追加情報, リリース3.0

B66847-01

Copyright © 1998, 2011, Oracle and/or its affiliates.All rights reserved.

原本著者: Chuck Murray

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

このソフトウェアまたは関連ドキュメントが、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供される場合は、次のNoticeが適用されます。

U.S. GOVERNMENT RIGHTS Programs, software, databases, and related documentation and technical data delivered to U.S. Government customers are "commercial computer software" or "commercial technical data" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, the use, duplication, disclosure, modification, and adaptation shall be subject to the restrictions and license terms set forth in the applicable Government contract, and, to the extent applicable by the terms of the Government contract, the additional rights set forth in FAR 52.227-19, Commercial Computer Software License (December 2007).Oracle America, Inc., 500 Oracle Parkway, Redwood City, CA 94065.

このソフトウェアまたはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアまたはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用する際、このソフトウェアまたはハードウェアを安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

OracleおよびJavaはOracle およびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXはX/Open Company, Ltd.によってライセンス提供された登録商標です。

このソフトウェアまたはハードウェアおよびドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。

目次

表一覧

タイトルおよび著作権情報

はじめに

- 対象読者

- ドキュメントのアクセシビリティについて

- 関連ドキュメント

- 表記規則

1 概要

2 OracleとMySQLの比較

- 2.1 データベース・セキュリティ

- 2.1.1 データベース認証

- 2.1.2 権限

- 2.2 スキーマの移行

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

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

- 2.2.3 表設計時の考慮事項

- 2.2.3.1 文字データ型

- 2.2.3.2 列のデフォルト値

- 2.2.4 複数のデータベースの移行

- 2.2.5 MySQLのスキーマ移行時の考慮事項

- 2.2.5.1 データベース

- 2.2.5.2 MySQLのグローバルおよびデータベース・レベル権限のOracleのシステム権限へのマッピング

- 2.2.5.3 一時表

- 2.2.5.4 スキーマ・オブジェクトの所有者

- 2.3 データ型

- 2.3.1 サポートされているOracleデータ型

- 2.3.2 デフォルトのデータ型マッピング

- 2.3.3 データ型の比較

- 2.3.3.1 数値型

- 2.3.3.2 日時型

- 2.3.3.3 文字列型

- 2.4 データ記憶域の概念

3 トリガーおよびストアド・プロシージャ

- 3.1 トリガー

- 3.2 ストアド・プロシージャ

- 3.2.1 個々のSQL文

- 3.2.1.1 REPLACE文

- 3.2.1.2 DO文

- 3.2.1.3 複合DECLARE文

- 3.2.1.4 複合SET文

- 3.2.2 ストアド・プロシージャの変数

- 3.2.3 ストアド・プロシージャでのエラー処理

4 トラブルシューティング

- 4.1 ユーザー・アカウントの定義

- 4.2 MySQLデータのダンプ

- 4.3 コマンドライン・オプションの最適化

索引

表一覧

- 2-1 OracleとMySQLのスキーマ・オブジェクト

- 2-2 MySQLの権限とOracleのシステム権限

- 2-3 サポートされているOracleデータ型

- 2-4 Oracle SQL Developerで使用されるデフォルトのデータ型マッピング

- 2-5 MySQLでサポートされているストレージ・エンジン

- 2-6 一般的なストレージ・エンジンの機能比較

はじめに

『Oracle SQL Developer MySQLからの移行のための追加情報』では、MySQLとOracle間のいくつかの相違点について説明します。移行プロセスにおいて、それらの相違点がSQL Developerによってどのように処理されるかの概要についても示します。

対象読者

このマニュアルは、SQL Developerを使用してMySQLデータベースをOracleに変換するユーザーを対象としています。

リレーショナル・データベースの概念と、OracleおよびMySQLを実行するオペレーティング・システム環境について理解している必要があります。

ドキュメントのアクセシビリティについて

オラクル社のアクセシビリティについての詳細情報は、Oracle Accessibility ProgramのWebサイトhttp://www.oracle.com/us/corporate/accessibility/index.htmlを参照してください。

Oracleサポートへのアクセス

Oracleカスタマは、My Oracle Supportから電子サポートにアクセスできます。詳細は、http://www.oracle.com/support/contact.htmlまたはhttp://www.oracle.com/accessibility/support.html(聴覚障害者向け)を参照してください。

関連ドキュメント

Oracle SQL Developerの使用については、SQL Developerのオンライン・ヘルプを参照してください。

Oracle SQL Developerのインストールの詳細は、『Oracle SQL Developerインストレーション・ガイド』を参照してください。

Oracleエラー・メッセージのドキュメントは、HTML版のみご利用いただけます。Oracle Database JP Documentation Libraryを使用する場合は、エラー・メッセージを範囲ごとに参照できます。特定の範囲のページを表示したら、ブラウザの「このページの検索」機能を使用して特定のメッセージを検索できます。インターネットに接続できる場合、Oracleオンライン・ドキュメントのエラー・メッセージ検索機能を使用して特定のエラー・メッセージを検索できます。

リリース・ノート、インストール・マニュアル、ホワイト・ペーパーまたはその他の関連ドキュメントは、OTN(Oracle Technology Network)から、無償でダウンロードできます。OTNを使用するには、オンラインでの登録が必要です。登録は、次のWebサイトから無償で行えます。

http://www.oracle.com/technology/global/jp/membership/index.html

すでにOTNのユーザー名およびパスワードを取得している場合は、次のURLでOTN Webサイトのドキュメントのセクションに直接接続できます。

http://www.oracle.com/technology/documentation/

表記規則

このマニュアルでは次の表記規則を使用します。

規則

意味

太字

太字は、操作に関連するGraphical User Interface要素、または本文中で定義されている用語および用語集に記載されている用語を示します。

イタリック体

イタリックは、ユーザーが特定の値を指定するプレースホルダ変数を示します。

固定幅フォント

固定幅フォントは、段落内のコマンド、URL、サンプル内のコード、画面に表示されるテキスト、または入力するテキストを示します。

1 概要

このマニュアルでは、Oracle SQL Developerツールを使用してMySQLデータベースをOracleに移行する方法について、その追加情報を示します。移行の計画に役立つ情報と、移行中や移行後に発生する可能性のある問題を解決するための情報を示します。

移行機能など、SQL Developerツールの使用方法を理解している必要があります。SQL Developerについては、『Oracle SQL Developerユーザーズ・ガイド』およびオンライン・ヘルプを参照してください。

追加情報は次のとおりです。

- 第2章「OracleとMySQLの比較」

- 第3章「トリガーおよびストアド・プロシージャ」

- 第4章「トラブルシューティング」

2 OracleとMySQLの比較

この章では、MySQLデータベースとOracle Databaseを比較します。内容は次のとおりです。

- データベース・セキュリティ

- スキーマの移行

- データ型

- データ記憶域の概念

2.1 データベース・セキュリティ

この項には、MySQLデータベースとOracle Databaseのセキュリティ問題に関する情報が含まれています。

Oracleと同様に、MySQLユーザーはデータベースによって管理されます。MySQLでは、一連の付与表を使用して、ユーザーとユーザーが所有できる権限を追跡します。MySQLでは、ユーザーに対して認証、認可およびアクセス制御を実行する際に、これらの付与表を使用します。

2.1.1 データベース認証

Oracle(データベース認証を使用するように設定した場合)や、ユーザー名とパスワードのみを使用してユーザーを認証する他のほとんどのデータベースとは異なり、MySQLでは、ユーザーを認証する際に、追加のlocationパラメータを使用します。このlocationパラメータは、通常、ホスト名、IPアドレスまたはワイルドカード(“%”)です。MySQLでは、この追加のパラメータを使用して、データベースへのユーザー・アクセスをドメイン内の特定のホストに制限する場合があります。また、これによって、接続元のホストに応じて、ユーザーに異なるパスワードと一連の権限を適用できます。したがって、abc.comからログオンするユーザーscottは、xyz.comからログオンするユーザーscottと同じである場合もありますが、異なる場合もあります。

2.1.2 権限

MySQLの権限システムは、継承を介して機能する階層システムです。高いレベルで付与された権限は、暗黙的にすべての低いレベルに渡されますが、低いレベルで設定されている同じ権限が優先される場合があります。MySQLでは、次の権限範囲の降順に5つの異なるレベルで権限を付与できます。

- グローバル

- ホスト単位ベース

- データベース・レベル

- 表固有

- 列固有(1つの表内の1つの列)

レベルごとの対応する付与表が、データベース内にあります。権限チェックを実行する際に、MySQLでは、権限範囲の降順に各表がチェックされ、低いレベルで付与された権限は、高いレベルで付与された同じ権限よりも優先されます。

MySQLでサポートされている権限は、2つのタイプ(管理権限とオブジェクト単位権限)に分類されます。管理権限は、サーバー全体に影響し、MySQLの機能に関連するグローバル権限です。これらの管理権限には、FILE、PROCESS、REPLICATION、SHUTDOWNおよびSUPER権限が含まれています。オブジェクト単位権限は、表、列、索引、ストアド・プロシージャなどのデータベース・オブジェクトに影響し、異なる範囲で付与できます。これらのオブジェクト単位権限には、権限チェックをトリガーするSQL問合せに関連する名前が付けられます。

Oracleと異なり、MySQLにはロールの概念がありません。したがって、ユーザーのグループに一連の同じ権限を付与するには、各ユーザーに対して権限を別々に付与する必要があります。また、監査の面では不十分ですが、あるロールとしてタスクを実行するユーザーはすべて、1つのユーザー・アカウント(そのロールのためのもので、必要な権限が付与されている)を共有することもあります。

2.2 スキーマの移行

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

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

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

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

- 表設計時の考慮事項

- 複数のデータベースの移行

- MySQLのスキーマ移行時の考慮事項

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

OracleとMySQLのスキーマ・オブジェクトには多くの類似点があります。ただし、これらのデータベース間で異なるスキーマ・オブジェクトもあります。スキーマ・オブジェクトの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

表2-1に、OracleとMySQLの相違点を示します。

表2-1 OracleとMySQLのスキーマ・オブジェクト

Oracle

MySQL

AFTERトリガー

トリガー

BEFOREトリガー

トリガー

チェック制約

チェック制約

列のデフォルト

列のデフォルト

データベース

データベース

外部キー

外部キー

索引

索引

パッケージ

該当なし

PL/SQLファンクション

ルーチン

PL/SQLプロシージャ

ルーチン

主キー

主キー

ロール

該当なし

スキーマ

スキーマ

順序

列のAUTO_INCREMENT

スナップショット

該当なし

シノニム

該当なし

表

表

表領域

該当なし

一時表

一時表

各行のトリガー

各行のトリガー

一意キー

一意キー

ユーザー

ユーザー

ビュー

ビュー

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

Oracleでは、オブジェクト名の大/小文字が区別されません。Oracleのスキーマ・オブジェクト名は大文字で格納されます。

Oracleと同様に、MySQLの列名、索引名、ストアド・プロシージャ名、トリガー名および列の別名は、すべてのプラットフォームで大/小文字が区別されません。ただし、MySQLの場合、データベース名と表名の大/小文字の区別はOracleと異なります。MySQLの場合、データベースはデータ・ディレクトリ内のディレクトリに対応し、表はデータベース・ディレクトリ内の1つ以上のファイルに対応します。そのため、データベース名と表名の大/小文字の区別は、基礎となるオペレーティング・システムの大/小文字の区別によって決定されます。つまり、データベース名と表名は、Windowsでは大/小文字が区別されませんが、UNIXのほとんどの種類では大/小文字が区別されます。ただし、MySQLでは、lower_case_table_namesシステム変数を使用することで、データベース名と表名がディスクにどのように格納されるか、およびMySQLでそれらの名前がどのように使用されるかをユーザーが決定できます。MySQL 4.1.1より前のリリースでは、表の別名は大/小文字が区別されます。

OracleとMySQLでは、引用識別子で名前を表すことによって予約語をオブジェクト名として使用できます。ただし、MySQLでは、DATE、TIMESTAMPなどのいくつかの予約語は、非引用識別子でオブジェクト名として使用できます。これは、Oracleでは許可されていません。SQL Developerでは、Oracleの予約語であるMySQLオブジェクトの名前にアンダースコア(_)が追加されます。

MySQLとOracleの識別子の定義には、わずかな違いがいくつかあります。MySQLでは、非引用識別子を数字で始めることができ、二重引用符を引用識別子内で使用できます。ただし、どちらもOracleの識別子では許可されていません。MySQLの場合、引用文字はバックティック(`)です。SQLモードANSI_QUOTESが設定されている場合は、二重引用符を使用して識別子を引用することもできます。Oracleの場合、識別子は二重引用符を使用して引用されます。

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

2.2.3 表設計時の考慮事項

この項では、MySQLデータベースをOracleに変換する際に考慮する必要がある表設計の問題について説明します。この項の内容は次のとおりです。

- 文字データ型

- 列のデフォルト値

2.2.3.1 文字データ型

MySQLとOracleの間には、サポートされているキャラクタ・タイプと、キャラクタ・タイプの値を格納および取得する方法にいくつかの違いがあります。

MySQLでは、65,535バイトより小さいキャラクタ・タイプに対してCHAR型とVARCHAR型がサポートされています。CHAR型の最大長は255バイトで、MySQL 3.23では、0バイトで宣言する場合もあります。MySQL 5.0.3より前の場合、VARCHAR型の長さの仕様はCHAR型と同じです。MySQL 5.0.3から、VARCHAR型の最大長は65,535バイトになりました。Oracleでは、4つのキャラクタ・タイプ(CHAR、NCHAR、NVARCHAR2およびVARCHAR2)がサポートされています。Oracleのすべてのキャラクタ・タイプで宣言可能な最小値は1バイトです。CHARおよびNCHARで使用可能な最大サイズは2,000バイトで、NVARCHAR2およびVARCHAR2の場合は4,000バイトです。

MySQLのCHARの値は、格納されるときに、指定した長さまで右に空白が埋め込まれ、取得されるときに、後続の空白が削除されます。一方、VARCHARの値は、指定したとおりの数の文字を使用して格納されますが、MySQL 5.0.3より前の場合は、値が格納および取得されるときに、後続の空白が削除されます。Oracleでは、値が列の長さより小さい場合、列の長さまでCHAR型とNCHAR型の値に空白が埋め込まれ、取得時に後続の空白は削除されません。NVARCHAR2およびVARVHAR2データ型の列の場合、Oracleでは、後続の空白も含めて、指定したとおりに値が格納および取得されます。

キャラクタ・タイプの列に指定した長さを超える値が割り当てられると、STRICT SQLモードが設定されていないかぎり、MySQLでは値が切り捨てられ、エラーは生成されません。Oracleでは、キャラクタ・タイプの列に割り当てられた値が指定した長さを超えると、エラーが生成されます。

MySQLの場合、すべてのキャラクタ・タイプ(CHAR、VARCHARおよびTEXT)の列には、列のキャラクタ・セットと照合があります。キャラクタ・セットまたは照合が列定義に明示的に定義されていない場合、表のキャラクタ・セットまたは照合が適用されます(指定されている場合)が、そうでない場合は、データベースのキャラクタまたは照合が選択されます。Oracleの場合、CHAR型とVARCHAR2型のキャラクタ・セットはデータベースのキャラクタ・セットによって定義され、NCHAR型とNVARCHAR型のキャラクタ・セットは各国語キャラクタ・セットによって定義されます。

MySQLでCHAR型またはVARCHAR型を宣言する場合、MySQL 4.1以上では、デフォルトの長さセマンティクスはバイトではなく文字です。Oracleでは、デフォルトの長さセマンティクスは、CHAR型およびVARCHAR2型の場合はバイトで、NCHAR型およびNVARCHAR2型の場合は文字です。

SQL Developerでは、MySQLのCHAR型とVARCHAR型をそれぞれOracleのCHAR型とVARCHAR2型にマップします。SQL Developerでは、OracleのCHARおよびVARCHAR2データ型の列の最大バイト数は、MySQLの対応するCHARおよびVARCHARデータ型の列に指定した最大長を保持するのに必要なバイト数から決定されます。MySQLのVARCHAR2の列でデータが4000バイトを超える場合、その列はOracleのCLOBデータ型の列に変換されます。

2.2.3.2 列のデフォルト値

NULL値が許可されない列のデフォルト値の処理方法は、MySQLとOracleでは異なります。

MySQLの場合、NULL値が許可されない列と、データが表に挿入される際にデータが提供されない列に対して、列のデフォルト値が決定されます。このデフォルト値は、列のデータ型に対する暗黙的なデフォルト値です。ただし、STRICTモードが有効になっていると、MySQLではエラーが生成され、トランザクション表に対してINSERT文がロールバックされます。

Oracleの場合、表にデータを挿入する際に、NULL値を許可しないすべての列にデータを指定する必要があります。Oracleでは、NOT NULL制約が設定されている列のデフォルト値は生成されません。

2.2.4 複数のデータベースの移行

SQL Developerでは、複数のMySQLデータベースが同じMySQLデータベース・サーバー上にある場合の移行がサポートされています。

2.2.5 MySQLのスキーマ移行時の考慮事項

MySQLのスキーマ移行時の考慮事項は、次の領域に適用されます。

- データベース

- MySQLのグローバルおよびデータベース・レベル権限のOracleのシステム権限へのマッピング

- 一時表

- スキーマ・オブジェクトの所有者

2.2.5.1 データベース

MySQLデータベースをOracleに移行する際に、SQL Developerは、各MySQLデータベースをOracleの表領域にマップします。表、索引、ビューなどのデータベース・オブジェクトは、それぞれの表領域に格納され、それらを所有するユーザーのOracleスキーマから参照されます。

2.2.5.2 MySQLのグローバルおよびデータベース・レベル権限のOracleのシステム権限へのマッピング

SQL Developerでは、MySQLに対するSUPER権限以外の管理権限はすべてが処理されるわけではありません。表2-2に、異なるレベルで付与されるMySQLのオブジェクト単位権限、およびグローバル・レベルで付与されるSUPER権限のマッピングを示します。

表2-2 MySQLの権限とOracleのシステム権限

レベル

権限

Oracleでのシステム権限

グローバル

ALTER

ALTER ANY TABLE、ALTER ANY SEQUENCE、ALTER ANY CUSTER、COMMENT ANY TABLE

グローバル

ALTER ROUTINE

ALTER ANY PROCEDURE、DROP ANY PROCEDURE

グローバル

CREATE

CREATE ANY TABLE、CREATE ANY SEQUENCE、CREATE ANY CLUSTER、CREATE DATABASE LINK、COMMENT ANY TABLE

グローバル

CREATE ROUTINE

CREATE ANY PROCEDURE

グローバル

CREATE USER

CREATE USER、GRANT ANY PRIVILEGE

グローバル

CREATE VIEW

CREATE ANY VIEW

グローバル

DELETE

ALTER ANY TABLE、DROP USER、DELETE ANY TABLE

グローバル

DROP

DROP ANY TABLE、DROP ANY SEQUENCE、DROP ANY CLUSTER、DROP ANY VIEW

グローバル

EXECUTE

EXECUTE ANY PROCEDURE

グローバル

INDEX

CREATE ANY INDEX、ALTER ANY INDEX、DROP ANY INDEX

グローバル

INSERT

INSERT ANY TABLE

グローバル

LOCK TABLES

LOCK ANY TABLE

グローバル

SELECT

SELECT ANY TABLE

グローバル

SUPER

CREATE ANY TRIGGER、DROP ANY TRIGGER

グローバル

UPDATE

UPDATE ANY TABLE

グローバル

USAGE

CREATE SESSION、ALTER SESSION、UNLIMITED TABLESPACE

データベース

CREATE

CREATE CLUSTER、CREATE DATABASE LINK、CREATE SEQUENCE、CREATE TABLE

データベース

CREATE ROUTINE

CREATE PROCEDURE

データベース

CREATE VIEW

CREATE VIEW

表

CREATE

CREATE TABLE

表

CREATE VIEW

CREATE VIEW

2.2.5.3 一時表

SQL Developerでは、一時表の移行はサポートされません。

MySQLでは、一時表は、現行のユーザー・セッションのみで参照可能であり、ユーザー・セッションが終了すると自動的に削除されるデータベース・オブジェクトです。

一度作成された一時表は明示的に削除されるまで存在し、適切な権限を持つすべてのセッションで参照可能であるという点で、Oracleの一時表の定義は、MySQLと若干異なります。ただし、一時表のデータは、表にデータを挿入するユーザー・セッションのみで参照可能であり、トランザクションまたはユーザー・セッションの存続中はデータが保持される場合があります。

2.2.5.4 スキーマ・オブジェクトの所有者

SQL Developerでは、移行されるすべてのデータベースについて、ストアド・プロシージャを除いたすべてのデータベース・オブジェクトを所有するMySQLルート・ユーザーのOracleスキーマが作成されます。ストアド・プロシージャの場合、それらを作成したMySQLユーザーが引き続き所有者となります。SQL Developerでは、移行されるMySQLユーザーごとにOracleスキーマが作成されます。

2.3 データ型

この項では、Oracleで使用するデータ型について説明します。MySQLのデータ型とそれと同等のOracleデータ型を示します。内容は次のとおりです。

- サポートされているOracleデータ型

- デフォルトのデータ型マッピング

- データ型の比較

2.3.1 サポートされているOracleデータ型

表2-3に、Oracle SQL DeveloperでサポートされているOracleデータ型を示します。

表2-3 サポートされているOracleデータ型

データ型

説明

BLOB

バイナリ・ラージ・オブジェクトです。最大サイズは4GBです。

CHAR (SIZE)

長さがsizeバイトの固定長文字データです。最大サイズは2000バイトです。デフォルトのサイズ(最小サイズ)は1バイトです。

CLOB

シングルバイト文字を含むキャラクタ・ラージ・オブジェクト。固定幅および可変幅の両方のキャラクタ・セットがサポートされています。両方でCHARデータベース・キャラクタ・セットが使用されます。最大サイズは4GBです。

DATE

DATEデータ型には、日時情報が格納されます。日時情報はCHARおよびNUMBERの両方のデータ型で表すことができますが、DATEデータ型には特別な関連プロパティが含まれます。DATE型の各値に対して、世紀、年、月、日、時間、分、秒などの情報が格納されます。

FLOAT

10進精度が38または2進精度が126の浮動小数点を指定します。

LONG (SIZE)

最大2GBまたは2^31 -1バイトの可変長文字データです。

LONG RAW

最大2GBの可変長のRAWバイナリ・データです。

NCHAR (SIZE)

長さがsize文字またはsizeバイト(使用している各国語キャラクタ・セットによって異なる)の固定長文字データです。最大サイズは、各文字の格納に必要なバイト数(上限2000バイト)で決まります。デフォルトのサイズ(最小サイズ)は1文字または1バイト(キャラクタ・セットによる)です。

NCLOB

マルチバイト・キャラクタを含むキャラクタ・ラージ・オブジェクト。固定幅および可変幅のキャラクタ・セットがサポートされます。両方のキャラクタ・セットでNCHARデータベース・キャラクタ・セットを使用します。最大サイズは4GBです。各国語キャラクタ・セットのデータを格納します。

NUMBER

精度がpでスケールがsの数値です。精度pは1から38の範囲になります。スケールsは-84から127の範囲になります。

NVARCHAR2 (SIZE)

最大長がsize文字またはsizeバイト(使用している各国語キャラクタ・セットによって異なる)の可変長文字列です。最大サイズは、各文字の格納に必要なバイト数(上限4000バイト)で決まります。NVARCHAR2にはサイズを指定する必要があります。

RAW (SIZE)

長さがsizeバイトのRAWバイナリ・データです。最大サイズは2000バイトです。RAW値にはサイズを指定する必要があります。

VARCHAR (SIZE)

VARCHARデータ型は、現在VARCHAR2データ型と同義です。VARCHARではなく、VARCHAR2を使用することをお薦めします。将来、VARCHARは、異なる比較セマンティクスで比較される可変長文字列で使用される別のデータ型として定義される可能性があります。最大サイズは4000で、最小サイズ(デフォルト)は1です。

BINARY_DOUBLE

64ビットの倍精度浮動小数点データ型です。

BINARY_FLOAT

32ビットの単精度浮動小数点データ型です。

Oracleデータ型の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

2.3.2 デフォルトのデータ型マッピング

表2-4に、SQL Developerでデータ型をMySQLからOracleに変換するために使用されるデフォルトの設定を示します。SQL Developerでは、代替データ型を指定することによって、特定のデータ型のデフォルトの設定を変更できます。デフォルトのデータ型マッピングの変更方法については、SQL Developerのオンライン・ヘルプを参照してください。

表2-4 Oracle SQL Developerで使用されるデフォルトのデータ型マッピング

MySQLデータ型

Oracleデータ型

BIGINT

NUMBER(19, 0)

BIT

RAW

BLOB

BLOB、RAW

CHAR

CHAR

DATE

DATE

DATETIME

DATE

DECIMAL

FLOAT(24)

DOUBLE

FLOAT(24)

DOUBLE PRECISION

FLOAT(24)

ENUM

VARCHAR2

FLOAT

FLOAT

INT

NUMBER(10, 0)

INTEGER

NUMBER(10, 0)

LONGBLOB

BLOB、RAW

LONGTEXT

CLOB、RAW

MEDIUMBLOB

BLOB、RAW

MEDIUMINT

NUMBER(7, 0)

MEDIUMTEXT

CLOB、RAW

NUMERIC

NUMBER

REAL

FLOAT(24)

SET

VARCHAR2

SMALLINT

NUMBER(5, 0)

TEXT

VARCHAR2、CLOB

TIME

INTERVALDAYTOSECOND

TIMESTAMP

DATE

TINYBLOB

RAW

TINYINT

NUMBER(3, 0)

TINYTEXT

VARCHAR2

VARCHAR

VARCHAR2、CLOB

YEAR

NUMBER

注意:
ENUMおよびSETデータ型には、Oracleへの直接マッピングは存在しません。SQL Developerによって、MySQLのENUM列がOracleのVARCHAR2列にマップされます。この場合、ENUMデータ型で使用可能な値のみがOracle内のマップされた列で使用可能になるように、これらの列に制約とトリガーが追加されます。

2.3.3 データ型の比較

この項では、MySQLデータ型とOracleデータ型の違いを示します。一部のMySQLデータ型には、複数の代替Oracleデータ型が存在します。この表の内容は、次のとおりです。

- 数値型

- 日時型

- 文字列型

2.3.3.1 数値型

MySQLデータ型をOracleの数値データ型にマップする場合は、次の条件が適用されます。

- マップ先のOracleデータ型に精度またはスケールが指定されていない場合は、ソースのMySQLデータ型の精度およびスケールが適用されます。

- マップ先のOracleデータ型に精度またはスケールが指定されている場合は、それらの値がソースのデータ型の同等値と比較され、最大値が選択されます。

次の表では、MySQLとOracleの数値型を比較しています。

MySQL

サイズ

Oracle

BIGINT

8バイト

NUMBER(19,0)

BIT

約(M+7)/8バイト

RAW

DECIMAL(M,D)

D > 0の場合はM+2バイト、D = 0の場合はM+1バイト(M < Dの場合はD+2)

FLOAT(24)、BINARY_FLOAT

DOUBLE

8バイト

FLOAT(24)、BINARY_FLOAT、BINARY_DOUBLE

DOUBLE PRECION

8バイト

FLOAT(24)、BINARY_DOUBLE

FLOAT(25<=X <=53)

8バイト

FLOAT(24)、BINARY_FLOAT

FLOAT(X<=24)

4バイト

FLOAT、BINARY_FLOAT

INT

4バイト

NUMBER(10,0)

INTEGER

4バイト

NUMBER(10,0)

MEDIUMINT

3バイト

NUMBER(7,0)

NUMERIC

D > 0の場合はM+2バイト、D = 0の場合はM+1バイト(M < Dの場合はD+2)

NUMBER

REAL

8バイト

FLOAT(24)、BINARY_FLOAT

SMALLINT

2バイト

NUMBER(5,0)

TINYINT

1バイト

NUMBER(3,0)

2.3.3.2 日時型

次の表では、MySQLとOracleの日時型を比較しています。

MySQL

サイズ

Oracle

DATE

3バイト

DATE

DATETIME

8バイト

DATE

TIMESTAMP

4バイト

DATE

TIME

3バイト

DATE

YEAR

1バイト

NUMBER

2.3.3.3 文字列型

MySQLデータ型をOracleの文字データ型にマップする場合は、次の条件が適用されます。

- マップ先のOracleデータ型に長さが指定されていない場合は、ソースのMySQLデータ型の長さが適用されます。

- マップ先のデータ型に長さが指定されている場合は、2つの長さの最大値が適用されます。

次の表では、MySQLとOracleの文字列型を比較しています。

注意:
Mは、最大表示サイズを示します。最大有効表示サイズは255です。Lは、浮動小数点型で、小数点の後に続く桁数を示します。

MySQL

サイズ

Oracle

BLOB

L + 2バイト(L<2^16)

RAW、BLOB

CHAR(m)

Mバイト(1<=M<=255)

CHAR

ENUM (VALUE1, VALUE2, ...)

ENUM値の数(上限65535)に応じて、1または2バイト

LONGBLOB

L + 4バイト(L < 2 ^ 32)

RAW、BLOB

LONGTEXT

L + 4バイト(L < 2 ^ 32)

RAW、CLOB

MEDIUMBLOB

L + 3バイト(L < 2^ 24)

RAW、BLOB

MEDIUMTEXT

L + 3バイト(L < 2^ 24)

RAW、CLOB

SET (VALUE1, VALUE2, ...)

セット・メンバーの数(上限64)に応じて、1、2、3、4または8バイト

TEXT

L + 2バイト(L<2^16)

VARCHAR2、CLOB

TINYBLOB

L + 4バイト(L <2 ^8)

RAW、BLOB

TINYTEXT

L + 4バイト(L <2 ^8)

VARCHAR2

VARCHAR(m)

MySQL 5.0.3より前の場合はL+1バイト(L<=Mおよび0<=M<=255)(MySQL 5.0.3以上の場合は0 <= M <= 65535で、有効な最大長は65,532バイト)

VARCHAR2、CLOB

2.4 データ記憶域の概念

この項では、MySQLとOracle Databaseのデータ記憶域における概念の相違点と類似点について説明します。

データ記憶域は、Oracleを含むほとんどすべてのデータベースとは異なるMySQLの側面です。MySQLでは、データベースはサーバーのデータ・ディレクトリ内のディレクトリに対応します。データベース内の表は、表に使用されるストレージ・エンジンに応じて、データベース・ディレクトリ内の1つ以上のファイルに対応します。

データベースでは、異なるストレージ・エンジンの表を混在させることができます。ストレージ・エンジンは、表のデータを格納および取得する役割を担っています。

MySQLでは、ユーザー環境の異なる要件を満たす様々なストレージ・エンジン(以前はテーブル・タイプと呼ばれていた)が提供されます。表2-5に、MySQLでサポートされているストレージ・エンジンを示します。

表2-5 MySQLでサポートされているストレージ・エンジン

ストレージ・エンジン

説明

MyISAM

フルテキスト索引を提供し、移植性に優れたデフォルトの非トランザクション・ストレージ・エンジン。

MERGE

同一の列と索引の情報を持つ一連のMyISAM表を1つのものとして使用できる非トランザクション・ストレージ・エンジン。

MEMORY(HEAP)

メモリーにデータを格納する非トランザクション・ストレージ・エンジン。

BDB(Berkeley DB)

最初のトランザクションセーフ・ストレージ・エンジン。

InnoDB

大量のデータを処理する際にパフォーマンスが最大になるように設計されたトランザクションセーフ・ストレージ・エンジン。行レベルロックを提供します。

FEDERATED

ローカル表ではなくリモート・データベースの表内のデータにアクセスするストレージ・エンジン。

ARCHIVE

非常に小さいフットプリントで索引のない大量のデータを格納できるストレージ・エンジン。

CSV

値をカンマで区切る形式を使用してテキスト・ファイルにデータを格納するストレージ・エンジン。

BLACKHOLE

データを受け入れるが、それを破棄して格納せず、ブラック・ホールのように動作するストレージ・エンジン。

EXAMPLE

何もしない「スタブ」エンジン。新しいエンジンの記述の開始方法を説明する例として機能することを目的とします。

ISAM

MySQLの元のストレージ・エンジン。バージョン5.0からMyISAMストレージ・エンジンがサポートされるようになったため非推奨になりました。

各ストレージ・エンジンには、メリットとデメリットがあります。ストレージ・エンジンを区別する機能として、トランザクション、ロック、同時実行性、移植性があります。次の表に、一般的に使用される4つのストレージ・エンジンの機能の概要を示します。

表2-6 一般的なストレージ・エンジンの機能比較

機能

MyISAM

HEAP

BDB

InnoDB

トランザクション

なし

なし

あり

あり

ロック粒度

表

表

ページ

行

記憶域

各表のデータ・ファイル(.MYD)および索引ファイル(.MYI)

メモリー内

各表の1つのデータおよび索引ファイル(.db)

すべての表の一連のデータ・ファイル

移植性

あり

該当なし

なし

あり

Oracle Databaseは、1つ以上の表領域で構成されています。表領域では論理記憶域が提供され、データを保持する物理ディスクとデータベースがリンク付けされます。表領域は、1つ以上のデータファイルから作成されます。データファイルは、ファイル・システム内のファイルまたはRAWデバイスで指定されるディスク領域の領域です。データファイルを追加することで表領域を大きくすることができます。

Oracle Databaseは、Oracle表が格納されている1つ以上のSYSTEM表領域で構成されています。ユーザー定義表領域でも構成できます。表領域は、データベース・オブジェクトの論理的な格納場所です。たとえば、特定の表または索引が作成される表領域内の場所を指定できます。

3 トリガーおよびストアド・プロシージャ

この章では、MySQLとOracleのトリガーおよびストアド・プロシージャを比較します。(この章で説明する情報は、MySQLリリース5にのみ適用され、それより前のリリースには適用されません。)Oracleのトリガーおよびストアド・プロシージャの詳細は、『Oracle Database PL/SQL言語リファレンス』を参照してください。この章の内容は次のとおりです。

- トリガー

- ストアド・プロシージャ

3.1 トリガー

トリガーは、トリガー・イベントが発生すると暗黙的に起動される名前付きデータベース・オブジェクトです。トリガー・アクションは、トリガー・イベントの前後に実行できます。トリガーとストアド・プロシージャは似ていますが、起動方法が異なります。

MySQLでは、トリガーは、リリース5.0.2以上でのみサポートされています。トリガーは、表に関連付けて、表でINSERT、DELETEまたはUPDATE文が実行された場合に起動するようにのみ定義できます。MySQLでは、1つの表に対して、起動のタイミング(BEFOREまたはAFTER)と、トリガー・イベントまたは文(INSERT、DELETE、UPDATE)が同じ2つのトリガーを定義することはできません。たとえば、1つの表に対して、2つのBEFORE INSERTトリガーや2つのAFTER UPDATEトリガーを定義することはできません。MySQLで定義されるトリガーはすべて行トリガーです。つまり、トリガーに定義付けられたアクションは、トリガーを起動する文の対象となる行ごとに実行されます。

トランザクション表の場合、トリガーの実行中のエラー処理では、トリガーを起動する文とトリガー・アクションの両方が正常に実行されるか、またはいずれも実行されません(実行済のすべての変更が失敗の際にロールバックされます)。非トランザクション表の場合、エラーが発生する前に行われたすべての変更は引き続き有効です。

次の例は、MySQLでトリガーを作成する構文を示しています。

CREATE TRIGGER <trigger name>
{ BEFORE | AFTER }
{ INSERT | UPDATE | DELETE }
ON <table name>
FOR EACH ROW
<triggered action>

Oracleでは、次のいずれかの操作が発生するとトリガーが起動します。

- 表またはビューのデータを変更するDML文(INSERT、DELETEまたはUPDATE)

- DDL文

- ユーザー・イベント(ログオン、ログオフなど)

- システム・イベント(起動、停止、エラー・メッセージなど)

Oracleでは、1つの表に対して、起動のタイミングとトリガー・イベントが同じである複数のトリガーを定義できます。ただし、トリガーを実行する順序は保証されません。トリガーは、行トリガーまたは文トリガーとして定義できます。文トリガーは、トリガーを起動する文の対象となる表内の行数にかかわらず、トリガーを起動する文ごとに1回起動されます。たとえば、DELETE文によって表内の複数の行が削除されても、文トリガーは1回のみ起動されます。

Oracleでは、トリガーの実行モデルはトランザクションです。トリガーを起動する文によって実行されるすべてのアクション(起動されたトリガーによって実行されるアクションを含む)が正常に実行される必要があります。そうでない場合は、すべてのアクションがロールバックされます。

3.2 ストアド・プロシージャ

ストアド・プロシージャは、サーバーに格納できるアプリケーション・ロジックを記述するのに有効な手段を提供します。ストアド・プロシージャおよびストアド・ファンクションは、MySQLとOracleの両方で使用されています。ストアド・ファンクションは、プロシージャと似ていますが、ファンクションはコールした環境に値を戻す点で異なります。MySQLでは、ストアド・プロシージャおよびストアド・ファンクションを、まとめてルーチンと呼びます。

次の各項では、MySQLとOracleのストアド・プロシージャを比較します。

- 個々のSQL文

- ストアド・プロシージャの変数

- ストアド・プロシージャでのエラー処理

3.2.1 個々のSQL文

この項では、次の文または要素に関する考慮事項について説明します。

- REPLACE文

- DO文

- 複合DECLARE文

- 複合SET文

3.2.1.1 REPLACE文

MySQLのREPLACE文には2つの用途があります。主キーまたは一意索引の新しいレコードと同じ値を持つレコードが表内に存在しない場合は、INSERT文のように機能します。存在する場合は、UPDATE文のように機能します。

Oracleには、MySQLのREPLACE文の機能をサポートするSQL文が組み込まれていません。この文をOracle用に変換するには、INSERT文とUPDATE文の両方を使用する、エミュレートされた関数を作成する必要があります。最初に、INSERT文を使用して表へのデータの挿入が試行されます。挿入に失敗すると、UPDATE文を使用して表のデータが更新されます。

3.2.1.2 DO文

MySQLのDO文は、名前のとおり何らかの処理を行いますが、結果は戻しません。具体的には、パラメータとして指定された式のカンマ区切りのリストを実行します。Oracleでは、DO文はSELECT expr1 [, expr2,…] INTO … FROM DUAL文に変換されます。

3.2.1.3 複合DECLARE文

MySQLのDECLARE文は、ストアド・プロシージャでローカル変数を宣言するために使用します。PL/SQLでは、複数の宣言は許可されていません。このため、各宣言を個別に行う必要があります。複合DECLARE文を同等に機能するPL/SQLコードに変換するには、MySQLの複数の宣言文を各宣言に1文ずつ、論理的に同等な個別の文に変換する必要があります。

たとえば、次のようなMySQLの1つの宣言文および複数の宣言文について考えてみます。

/* Simple declaration */
DECLARE a INT;

/* Compound declaration */
DECLARE a, b INT DEFAULT 5;

同等に機能するPL/SQL文は、次のようになります。

/* Simple declaration */
a INT;

/* Multiple declarations */
a INT := 5;
b INT := 5;

この例では、MySQLのDECLARE文に含まれる各宣言に対してPL/SQLでそれぞれ1つの宣言文が使用され、MySQLの元の2つのDECLARE文は、PL/SQLで論理的に同等な3つの宣言文に変換されています。

3.2.1.4 複合SET文

MySQLのSET文は、変数(ユーザー変数またはシステム変数)に値を代入するために使用します。MySQLでは、同じ文内で複数の変数に値を代入する複合文が許可されています。PL/SQLでは、1つの変数に1つの値を代入する単純な代入のみが許可されています。複合SET文を同等に機能するPL/SQLコードに変換するには、MySQLの複数の代入文を論理的に同等の単純な代入文に分割する必要があります。

たとえば、次のようなMySQLの1つの代入文および複数の代入文について考えてみます。

/* Simple statement */
SET a:=1;

/* Compound statement*/
SET x:=1, y:=0;

同等に機能するPL/SQL文は、次のようになります。

/* Simple statement */
a:=1;

/* Multiple statements */
x:=1;
y:=0;

この例では、MySQLのSET文に含まれる各代入文に対してPL/SQLでそれぞれ1つの代入文が使用され、MySQLの元の2つのSET文は、PL/SQLで論理的に同等な3つの代入文に変換されています。

3.2.2 ストアド・プロシージャの変数

MySQLのストアド・プロシージャでは、ローカル変数、ユーザー変数およびシステム変数という3つのタイプの変数がサポートされています。

ローカル変数はストアド・プロシージャ内で宣言され、宣言が行われたBEGIN…ENDブロック内でのみ有効です。ローカル変数は、BEGIN…ENDブロック(ネストされたBEGIN…ENDブロックを含む)内の他の文によって参照される前に、このブロック内で宣言される必要があります。ネストされたBEGIN…ENDブロック内で宣言されたローカル変数が、そのブロックを囲むBEGIN…ENDブロック内で宣言されたローカル変数と同じ名前を持つ場合、ネストされたBEGIN…ENDブロックでローカル変数が参照される際は常に、ネストされたブロックのローカル変数が優先されます。ローカル変数には、任意のSQLデータ型を使用できます。次の例は、ストアド・プロシージャでのローカル変数の使用を示しています。

CREATE PROCEDURE p1()
BEGIN
/* declare local variables */
DECLARE x INT DEFAULT 0;
DECLARE y, z INT;

/* using the local variables */
SET x := x + 100;
SET y := 2;
SET z := x + y;

BEGIN
/* local variable in nested block */
DECLARE z INT;

SET z := 5;

/* local variable z takes precedence over the one of the
same name declared in the enclosing block. */
SELECT x, y, z;
END;

SELECT x, y, z;
END;

mysql> call p1();
+-----+---+---+
| x   | y | z |
+-----+---+---+
| 100 | 2 | 5 |
+-----+---+---+
1 row in set (0.00 sec)

+-----+---+-----+
| x   | y | z   |
+-----+---+-----+
| 100 | 2 | 102 |
+-----+---+-----+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)

ユーザー変数はユーザー・セッション固有であるため、他のユーザーが参照または使用することはできません。ユーザー変数は、ユーザー・セッションの存続中にのみ有効で、ユーザー・セッションが終了すると自動的に解放されます。ユーザー変数には、セッションスコープが存在します。このため、セッション内では、同じ名前のユーザー変数に対する参照は、すべて同じ変数を参照します。MySQLストアド・プロシージャでは、ユーザー変数は名前の先頭にアンパサンド(@)が付いています(@xや@yなど)。次の例は、2つのストアド・プロシージャでのユーザー変数の使用を示しています。

CREATE PROCEDURE p2()
BEGIN
SET @a = 5;
SET @b = 5;
SELECT @a, @b;
END;

CREATE PROCEDURE p3()
BEGIN
SET @a = @a + 10;
SET @b = @b - 5;
SELECT @a, @b;
END;

mysql> call p2();
+------+------+
| @a   | @b   |
+------+------+
| 5    | 5    |
+------+------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> call p3();
+------+------+
| @a   | @b   |
+------+------+
| 15   | 0    |
+------+------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

前述の例に示した2つ目のプロシージャ(p3)では、代入文の右側でユーザー変数aおよびbを使用する際に、1つ目のプロシージャで変数が任意の値に初期化されていることを前提にしています。1つ目のプロシージャで変数が初期化されていないと、変数はNULL値になるため、代入の結果もNULL値になります。

MySQLのストアド・プロシージャでは、システム変数も参照できます。MySQLには、グローバル・システム変数およびセッション・システム変数という2つのシステム変数があります。グローバル・システム変数は、サーバー全体の操作に影響します。セッション・システム変数は、個々のユーザー・セッションに影響します。MySQLのストアド・プロシージャでは、動的システム変数を変更することもできます。

SET文では、グローバル変数の場合は変数名の前にGLOBALまたは@@global.を付けます。セッション変数の場合はオプションで変数名の前にSESSION、@@session.、LOCALまたは@@local.を付けます。システム変数は、@@[global.|session.|local.]var_name構文を使用して、SELECT文で参照できます。global.、session.またはlocal.が存在しないと、MySQLでは、SESSION変数が存在する場合はSESSION変数が、存在しない場合はGLOBAL変数が戻されます。次の例は、構文オプションを示しています。

CREATE PROCEDURE p4()
BEGIN
/* setting the value of a (dynamic) global variable */
SET GLOBAL sort_buffer_size := 10000;

/* retrieving the value of a global variable */
SELECT @@global.sort_buffer_size;

/* setting the value of a (dynamic) session variable */
SET max_join_size := DEFAULT;

/* retrieving the value of a session variable, shown using
different syntax */
SELECT @@session.max_join_size;
SELECT @@local.max_join_size;
SELECT @@max_join_size;
END;

OracleのPL/SQLでも、ストアド・プロシージャで変数を宣言および使用できます。MySQLと同様に、PL/SQLの変数は、PL/SQLブロックの他の文によって参照される前に、このブロックの宣言部で宣言される必要があります。

PL/SQLのローカル変数のスコープは、MySQLのストアド・プロシージャのローカル変数と同じです。ローカル変数は、宣言が行われたPL/SQLブロック(ネストされたPL/SQLブロックを含む)内で有効です。ネストされたPL/SQLブロック内の変数名は、そのブロックを囲むPL/SQLブロック内に同じ変数名があっても優先されます。

MySQLのローカル変数と同様に、PL/SQLの変数には、任意のSQLデータ型(NUMBER、VARCHAR2など)を使用できます。また、PL/SQLの変数には、PL/SQLデータ型(BOOLEAN、PLS_INTEGERなど)を使用したり、特別な修飾子%TYPEおよび%ROWTYPEを使用して表の列または表の行を保持するように宣言することもできます。

次の例は、PL/SQLブロックでの変数宣言を示しています。

DECLARE
/* variables of SQL data-type */
wages NUMBER;
hours_worked NUMBER := 40;
hourly_salary NUMBER := 22.50;
bonus NUMBER := 150;
country VARCHAR2(128);
counter NUMBER := 0;

/* variables of PL/SQL data-types */
done BOOLEAN;
valid_id BOOLEAN;

/* variables declared to hold table rows */
emp_rec1 employees%ROWTYPE;
emp_rec2 employees%ROWTYPE;
BEGIN
wages := (hours_worked * hourly_salary) + bonus;
country := 'France';
country := UPPER('Canada');
done := (counter > 100);
valid_id := TRUE;
emp_rec1.first_name := 'Antonio';
emp_rec1.last_name := 'Ortiz';
emp_rec1 := emp_rec2;
END;

OracleのPL/SQLでは、ストアド・プロシージャで定数を宣言することもできます。変数と同様に、定数は、PL/SQLブロック(ネストされたPL/SQLブロックを含む)内の他の文によって参照される前に、このブロックの宣言部で宣言される必要があります。定数は、CONSTANTキーワードで宣言されます。定数は宣言の中で初期化する必要があり、これ以降に値を代入することはできません。次の例は、PL/SQLでの定数の宣言を示しています。

credit_limit CONSTANT NUMBER := 5000.00;

MySQLのストアド・プロシージャのユーザー変数は、パッケージで変数を定義することによってOracleでエミュレートできます。パッケージ仕様部では、MySQLのユーザー変数がセッションごとにエミュレートされます。ユーザーは、パッケージで定義済の変数を使用できます。次の例は、MySQLのストアド・プロシージャおよびOracle用に変換された同等の文を示しています。次のようなMySQLのストアド・プロシージャを考えてみます。

CREATE PROCEDURE p2()
BEGIN
SET @a = 5;
SET @b = 5;
SELECT @a, @b;
END;

Oracleでの同等の文は次のようになります。

CREATE OR REPLACE PACKAGE root.globalPkg AS
a NUMBER;
b NUMBER;
END globalPkg;

CREATE OR REPLACE PROCEDURE root.p2 AS
BEGIN
globalPkg.a := 5;
globalPkg.b := 5;

DBMS_OUTPUT.PUT_LINE(globalPkg.a || ',' || globalPkg.b);
END p2;

CREATE OR REPLACE PROCEDURE root.p3 AS
BEGIN
globalPkg.a := globalPkg.a + 10;
globalPkg.b := globalPkg.b - 5;

DBMS_OUTPUT.PUT_LINE(globalPkg.a || ',' || globalPkg.b);
END p3;

3.2.3 ストアド・プロシージャでのエラー処理

ストアド・プロシージャでのエラー処理メカニズムは、OracleのPL/SQLとMySQLの両方で実装されています。ストアド・プロシージャでは、次の文を処理する前に、各SQL文に対してエラーの有無が確認されます。エラーが発生するとすぐに、制御がエラー・ハンドラに渡されます。たとえば、SELECT文によってデータベースの行が検出されないと、エラーが発生し、このエラーを処理するコードが実行されます。

MySQLのストアド・プロシージャでは、ストアド・プロシージャ内でSQL文を実行することによって発生するエラーまたは警告を処理するようにハンドラを定義できます。MySQLでは、CONTINUEハンドラおよびEXITハンドラという2つのタイプのハンドラを使用できます。2つのタイプのハンドラは、ハンドラの実行後のストアド・プロシージャでの次の実行ポイントが異なります。CONTINUEハンドラの場合、エラーを発生させた文の次の文で実行が継続されます。EXITハンドラの場合、BEGIN文およびEND文で囲まれている現行の複合文は終了し、実行はこの複合文の次の文(存在する場合)で継続されます。

ハンドラは、1つ以上の条件を処理するように定義できます。条件は、SQLSTATE値、MySQLのエラー・コード、または事前定義済の条件のいずれかです。事前定義済の条件には、SQLWARNING(警告または注意)、NOT FOUND(行がない)およびSQLEXCEPTION(エラー)があります。条件は名前を使用して個別に定義でき、定義後はハンドラ文で参照できます。すべてのハンドラは、複合文ブロックの開始時に定義されます。

OracleのPL/SQLのストアド・プロシージャでは、エラー状態は例外と呼ばれます。例外には、(ランタイム・システムによって)内部的に定義された例外と、ユーザーが定義する例外があります。内部例外には、名前が事前定義されています(ZERO_DIVIDE、NO_DATA_FOUNDなど)。内部例外は、ランタイム・システムによって暗黙的に(自動的に)呼び出されます。ユーザー定義の例外には名前を付ける必要があり、ストアド・プロシージャのRAISE文によって明示的に呼び出す必要があります。呼び出された例外は、例外ハンドラによって処理されます。

例外ハンドラは、PL/SQLブロックで宣言できます。例外ハンドラはBEGIN文およびEND文で囲まれ、(サブ・ブロックを含む)PL/SQLブロック内の文によって例外が呼び出されると、これを処理します。PL/SQLブロックは、MySQLの複合文ブロックと似ています。例外は、PL/SQLブロックの宣言部でのみ宣言でき、そのブロックに対してはローカルであり、そのサブブロックすべてに対してはグローバルです。このため、外側のブロックは、サブブロックで呼び出された例外がローカルである場合も、これを処理できません。サブブロックで呼び出された例外は、サブブロックで定義された例外ハンドラがこれを処理し、例外ハンドラで再度呼び出されない場合、外側のブロックに伝播されません。例外ハンドラを実行した後、現行のブロックでは実行が停止され、外側のブロックの次の文で再開されます。

次の例は、MySQLおよびOracleのストアド・プロシージャでのエラー処理メカニズムの使用を示しています。次のようなMySQLのストアド・プロシージャを考えてみます。

CREATE PROCEDURE adjust_emp_salary ()
BEGIN
DECLARE job_id INT;
DECLARE employee_id INT DEFAULT 115;
DECLARE sal_raise DECIMAL(3,2);
DECLARE EXIT HANDLER FOR 1339;

SELECT job_id INTO jobid FROM employees WHERE employee_id = empid;
CASE
WHEN jobid = 'PU_CLERK' THEN
SET sal_raise := .09;
WHEN jobid = 'SH_CLERK' THEN
SET sal_raise := .08;
WHEN jobid = 'ST_CLERK' THEN
SET sal_raise := .07;
END CASE;
END;

Oracleでは、同等のPL/SQLは次のようになります。

CREATE OR REPLACE PROCEDURE adjust_emp_salary ()
AS
jobid employees.job_id%TYPE;
empid employees.employee_id%TYPE := 115;
sal_raise NUMBER(3,2);
BEGIN
SELECT job_id INTO jobid from employees
WHERE employee_id = empid;

CASE
WHEN jobid = 'PU_CLERK' THEN
sal_raise := .09;
WHEN jobid = 'SH_CLERK' THEN
sal_raise := .08;
WHEN jobid = 'ST_CLERK' THEN
sal_raise := .07;
END CASE;
EXCEPTION
WHEN CASE_NOT_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Employee salary not adjusted.');
END;

4 トラブルシューティング

この章では、コマンドライン・オプションを最適化する方法およびMySQLデータベース・サーバーにSQL Developerを接続する際に問題が発生しないようにする方法について説明します。内容は次のとおりです。

- ユーザー・アカウントの定義

- MySQLデータのダンプ

- コマンドライン・オプションの最適化

4.1 ユーザー・アカウントの定義

Oracleに移行する際、SQL Developerは、現行のデータベース接続に関連付けられるMySQLユーザーとしてMySQLデータベースに接続しようとします。(SQL DeveloperはMySQLのrootユーザーを使用しません。)SQL Developerでは、指定したMySQLユーザーがアクセス権を所有しているMySQLデータベース・オブジェクトのみを取得できます。

そのため、MySQLの移行に使用するデータベース接続を作成する場合は、Oracleに移行する予定のすべてのオブジェクトおよびデータにアクセスするのに十分な権限を所有しているMySQLユーザーを必ず指定してください。

4.2 MySQLデータのダンプ

MySQLからOracleへの移行で問題が発生する場合は、Oracle Technology NetworkにあるSQL Developerディスカッション・フォーラムを確認できます。

サポート契約がある場合は、SQL Developerのサポート・チームからMySQLデータベースのダンプの提供を求められることがあります。これによって、問題の追跡および迅速な解決策の提供がより簡単になります。mysqldumpメソッドを使用してMySQLデータベースのコピーを作成するには、他のシステム(異なるハードウェア・アーキテクチャを持つシステムも含む)に移植可能なテキスト・ファイルを生成します。SQL Developerのサポート・チームは、その出力を別のデータベースに再生成できます。

次の表に、MySQLデータのダンプ、およびmysqldump出力テキスト・ファイルからのデータベースの生成に使用されるコードの説明を示します。

コマンド

説明

mysqldump

MySQLデータベース内のスキーマおよびデータをファイルに抽出できます。

mysql

コマンドを実行できるようにMySQLをロードします。

-u ユーザー名

MySQLユーザー名です。

-p パスワード

指定したユーザーのパスワードです。

--opt

表ダンプの速度を最適化し、リロード速度のためにダンプ・ファイルを作成します。--optで有効になるオプションの定義リストは、「コマンドライン・オプションの最適化」を参照してください。

database_name

出力テキスト・ファイルにダンプする情報が含まれているデータベースの名前です。

>

UNIXおよびNTで入力のリダイレクトに使用される記号です。

file_name.sql

MySQLデータベース情報が含まれているファイルの名前です。

MySQLデータをダンプするには、次のコマンドを使用します。

% mysqldump -u user name -ppassword --opt database_name > file_name.sql

mysqldump出力テキスト・ファイルのデータベースをデータベースに再生成するには、次のコマンドを使用します。

% mysql -u user name -ppassword database_name < file_name.sql

4.3 コマンドライン・オプションの最適化

--optを使用すると、mysqldumpコマンドラインのオプションが自動的に有効になります。次の表に、-optコマンドで囲まれたコマンドを示します。

コマンド

説明

--add-drop-table

各CREATE TABLE文の前にDROP TABLE IF EXISTSを追加します。

--all

MySQL固有のすべての作成オプションを含めます。

--extended-insert

複数行のINSERT文を作成します。

--quick

問合せをバッファに入れないで、表を標準出力に直接ダンプします。このオプションの使用中にmysqldumpを一時停止すると、サーバーが応答を停止する可能性があるため、他のクライアントに影響を与える場合があります。

--lock-tables

すべての表を読取り専用でロックします。

索引
C  D  E  M  O  P  R  S  T  U  V

C

デフォルトのデータ型の変更, 2.3.2

コマンドライン・オプション，最適化, 4.3

複合DECLARE文, 3.2.1.3

複合SET文, 3.2.1.4

D

データ記憶域の概念, 2.4

データ型, 2.3

比較, 2.3.3

デフォルト, 2.3.2

サポートされている, 2.3.1

DECLARE文

複合, 3.2.1.3

デフォルトのデータ型, 2.3.2 定義，ユーザー・アカウント, 4.1 DO文, 3.2.1.2 MySQLデータのダンプ, 4.2

E

エラー処理

ストアド・プロシージャ, 3.2.3

例外処理, 3.2.3

M

デフォルトのデータ型の変更, 2.3.2

MySQL

データのダンプ, 4.2

O

概要, 3.2

トリガー, 3.1

P

プロシージャ

ストアド・プロシージャでのエラー処理, 3.2.3

ストアド・プロシージャの変数, 3.2.2

R

REPLACE文, 3.2.1.1

S

スキーマの移行, 2.2

SET文

複合, 3.2.1.4

ストアド・プロシージャ, 3.2

エラー処理, 3.2.3

概要, 3.2

変数, 3.2.2

サポート・オプション, 4.2 サポートされているデータ型, 2.3.1

T

表設計の考慮事項, 2.2.3

トリガー, 3.1

トリガー

概要, 3.1

トラブルシューティング，接続の問題, 4

U

ユーザー・アカウント，定義, 4.1

V

変数

ストアド・プロシージャ, 3.2.2

オラクル社の法律上の注意点について

コピーライトについて

Copyright © 1994-2014, Oracle and/or its affiliates.All rights reserved.

商標と登録商標について

OracleおよびJavaはOracle Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

ライセンス制約の保証と結果的に生じる損害の免責

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

保証免責

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

制限付権利

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs.No other rights are granted to the U.S. Government.

危険な用途への使用について

このソフトウェアもしくはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアもしくはハードウェアは、危険が伴うアプリケーション（人的傷害を発生させる可能性があるアプリケーションを含む）への用途を目的として開発されていません。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性（redundancy）、その他の対策を講じることは使用者の責任となります。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

第三者のコンテンツ、製品、サービスに対する免責事項

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

ドラフトのアルファ版およびベータ版ドキュメントについて

このドキュメントが試作版の場合:

このドキュメントは試作版であり、デモおよび暫定使用のみを目的としたものです。このソフトウェアを使用するハードウェアに限定するものではありません。オラクル社およびその関連会社は、このドキュメントに関して一切の責任を負わず、いかなる保証もいたしません。また、このドキュメントを使用したことによって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。