Oracle® SQL Developer

Microsoft SQL ServerおよびSybase Adaptive Serverからの移行のための追加情報

リリース3.0

B66848-01(原本部品番号:E18462-03)

2011年3月

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

Oracle SQL Developer Microsoft SQL ServerおよびSybase Adaptive Serverからの移行のための追加情報, リリース3.0

B66848-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 概要

- 1.1 概要

- 1.2 製品説明

- 1.3 機能

- 1.4 用語集

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

- 2.1 スキーマの移行

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

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

- 2.1.3 表の設計上の考慮事項

- 2.1.3.1 データ型

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

- 2.1.3.3 参照整合性制約

- 2.1.3.4 一意キー制約

- 2.1.3.5 チェック制約

- 2.2 データ型

- 2.2.1 データ型の表

- 2.3 データ記憶域の概要

- 2.3.1 データ記憶域の概要表

- 2.4 データ操作言語

- 2.4.1 データベースへの接続

- 2.4.2 SELECT文

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

- 2.4.2.2 SELECT INTO文:

- 2.4.2.3 列別名:

- 2.4.2.4 表の別名:

- 2.4.2.5 計算:

- 2.4.3 GROUP BYが指定されたSELECT文

- 2.4.4 INSERT文

- 2.4.5 UPDATE文

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

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

- 2.4.6 DELETE文

- 2.4.6.1 2つ目のFROM句の削除:

- 2.4.7 演算子

- 2.4.7.1 比較演算子

- 2.4.7.2 算術演算子

- 2.4.7.3 文字列演算子

- 2.4.7.4 集合演算子

- 2.4.7.5 ビット演算子

- 2.4.8 組込みファンクション

- 2.4.8.1 文字ファンクション

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

- 2.4.8.3 日付ファンクション

- 2.4.8.4 算術ファンクション

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

- 2.4.9.1 ロック

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

- 2.4.9.3 読取り一貫性

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

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

- 3.1 トリガー

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

- 3.2.1 個々のSQL文

- 3.2.1.1 Microsoft SQL ServerまたはSybase Adaptive Server:

- 3.2.1.2 Oracle:

- 3.2.1.3 Microsoft SQL ServerまたはSybase Adaptive Server:

- 3.2.1.4 Oracle:

- 3.2.2 論理トランザクション処理

- 3.2.2.1 トランザクション処理文

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

- 3.2.3.1 RAISERROR文

- 3.2.3.2 エラー・メッセージのカスタマイズ

- 3.3 データ型

- 3.3.1 ローカル変数

- 3.3.2 サーバー・データ型

- 3.3.3 複合データ型

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

- 3.4.1 プロシージャ

- 3.4.1.1 作成

- 3.4.1.2 削除

- 3.4.1.3 実行

- 3.4.1.4 変更

- 3.4.2 ファンクション

- 3.4.2.1 作成

- 3.4.2.2 削除

- 3.4.2.3 実行

- 3.4.2.4 変更

- 3.4.3 パッケージ

- 3.4.3.1 作成

- 3.4.3.2 削除

- 3.4.3.3 変更

- 3.4.4 パッケージ本体

- 3.4.4.1 作成

- 3.4.4.2 削除

- 3.4.4.3 変更

- 3.5 T-SQLとPL/SQLの構文

- 3.5.1 CREATE PROCEDURE文

- 3.5.2 パラメータの受渡し

- 3.5.3 DECLARE文

- 3.5.4 IF文

- 3.5.5 RETURN文

- 3.5.6 RAISERROR文

- 3.5.7 EXECUTE文

- 3.5.8 WHILE文

- 3.5.9 GOTO文

- 3.5.10 @@Rowcountおよび@@Error変数

- 3.5.11 ASSIGNMENT文

- 3.5.12 SELECT文

- 3.5.13 GROUP BY句が指定されたSELECT文

- 3.5.14 列別名

- 3.5.15 FROMが指定されたUPDATE文

- 3.5.16 FROMが指定されたDELETE文

- 3.5.17 一時表

- 3.5.18 カーソル処理

- 3.6 T-SQLとPL/SQLの言語要素

- 3.6.1 トランザクション処理方法

- 3.6.1.1 変換準備に関する推奨事項

- 3.6.2 例外処理方法およびエラー処理方法

- 3.6.3 特別なグローバル変数

- 3.6.4 演算子

- 3.6.5 組込みファンクション

- 3.6.6 Microsoft SQL ServerまたはSybase Adaptive Serverストアド・プロシージャ内のDDL構文

4 分散環境

- 4.1 分散環境

- 4.1.1 分散環境でのリモート・データベース・アクセス

- 4.1.1.1 Oracleおよびリモート・オブジェクト

- 4.1.2 Microsoft SQL ServerまたはSybase Adaptive Serverとリモート・オブジェクト

- 4.1.3 レプリケーション

- 4.2 アプリケーション開発ツール

5 非接続ソース・モデルのロード

- 5.1 データベースのメタデータ・フラット・ファイルの生成

- 5.1.1 フラット・ファイルの生成スクリプト

- 5.1.1.1 スクリプトの実行

索引

表一覧

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

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

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

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

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

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

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

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

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

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

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

- 2-12 NULL構文の変更

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

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

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

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

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

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

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

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

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

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

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

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

- 3-1 Oracleの複合データ型

- 3-2 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverでのプロシージャ・スキーマ・オブジェクトの作成方法の比較

- 3-3 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverでのプロシージャ・スキーマ・オブジェクトの削除方法の比較

- 3-4 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverでのプロシージャ・スキーマ・オブジェクトの実行方法の比較

- 3-5 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverでのプロシージャ・スキーマ・オブジェクトの変更方法の比較

- 3-6 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverでのファンクション・スキーマ・オブジェクトの作成方法の比較

- 3-7 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverでのファンクション・スキーマ・オブジェクトの削除方法の比較

- 3-8 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverでのファンクション・スキーマ・オブジェクトの実行方法の比較

- 3-9 OracleとMicrosoft SQL ServerまたはSybase Adaptive Server 7.0でのファンクション・スキーマ・オブジェクトの変更方法の比較

- 3-10 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverでのパッケージ・スキーマ・オブジェクトの作成方法の比較

- 3-11 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverでのパッケージ・スキーマ・オブジェクトの削除方法の比較

- 3-12 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverでのパッケージ・スキーマ・オブジェクトの変更方法の比較

- 3-13 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverでのパッケージ本体スキーマ・オブジェクトの作成方法の比較

- 3-14 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverでのパッケージ本体スキーマ・オブジェクトの削除方法の比較

- 3-15 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverでのパッケージ本体スキーマ・オブジェクトの変更方法の比較

- 3-16 OracleとMicrosoft SQL ServerまたはSybase Adaptive ServerのCREATE PROCEDURE文の比較

- 3-17 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverのパラメータの受渡しの比較

- 3-18 OracleとMicrosoft SQL ServerまたはSybase Adaptive ServerのDECLARE文の比較

- 3-19 OracleとMicrosoft SQL ServerまたはSybase Adaptive ServerのIF文の比較

- 3-20 OracleとMicrosoft SQL ServerまたはSybase Adaptive ServerのRETURN文の比較

- 3-21 OracleとMicrosoft SQL ServerまたはSybase Adaptive ServerのRAISERROR文の比較

- 3-22 OracleとMicrosoft SQL ServerまたはSybase Adaptive ServerのEXECUTE文の比較

- 3-23 OracleとMicrosoft SQL ServerまたはSybase Adaptive ServerのWHILE文の比較

- 3-24 OracleとMicrosoft SQL ServerまたはSybase Adaptive ServerのGOTO文の比較

- 3-25 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverでの@@Rowcountおよび@@Error変数の比較

- 3-26 OracleとMicrosoft SQL ServerまたはSybase Adaptive ServerのASSIGNMENT文の比較

- 3-27 OracleとMicrosoft SQL ServerまたはSybase Adaptive ServerのSELECT文の比較

- 3-28 OracleとMicrosoft SQL ServerまたはSybase Adaptive ServerでのGROUP BY句が指定されたSELECT文の比較

- 3-29 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverでの列別名の比較

- 3-30 OracleとMicrosoft SQL ServerまたはSybase Adaptive ServerのFROMが指定されたUPDATE文の比較

- 3-31 OracleとMicrosoft SQL ServerまたはSybase Adaptive ServerのFROMが指定されたDELETE文の比較

- 3-32 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverの一時表の比較

- 3-33 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverでのカーソル処理の結果セットの比較

- 3-34 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverのトランザクション処理文の比較

- 3-35 トランザクション処理文の変換方法

- 5-1 スクリプト・ファイルの位置と名前および関連するファイルの名前

はじめに

『Oracle SQL Developer Microsoft SQL ServerおよびSybase Adaptive Serverからの移行のための追加情報』では、Microsoft SQL Server 7.0、2000または2005からOracleへのデータベースの移行、またはSybase Adaptive Server 12または15からのデータベースの移行について詳細に説明します。移行にどのような変換ツールを使用しているかにかかわらず使用できるガイドですが、これらの移行にはOracle SQL Developer(SQL Developer)を使用することをお薦めします。このリファレンス・ガイドでは、Microsoft SQL ServerまたはSybase Adaptive ServerとOracle間のいくつかの相違点について説明し、変換プロセス中にそれらの相違点がSQL Developerによってどのように処理されるかの概要を示します。

対象読者

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

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

オラクル社のアクセシビリティについての詳細情報は、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とMicrosoft SQL ServerまたはSybase Adaptive Serverを実行しているオペレーティング・システム環境について理解している必要があります。

関連ドキュメント

詳細は、次のOracle 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(SQL Developer)について説明します。内容は次のとおりです。

- 1.1 「概要」

- 1.2 「製品説明」

- 1.3 「機能」

- 1.4 「用語集」

1.1 概要

SQL Developerは、Microsoft SQL ServerまたはSybase Adaptive Server環境からOracle Databaseへのデータおよびアプリケーションの移行を簡略化するツールです。SQL Developerを使用すると、統合されたビジュアル環境にアプリケーション・システム全体(トリガーおよびストアド・プロシージャを含むデータベース・スキーマ)を迅速かつ簡単に移行できます。

注意:
このマニュアルでは、特に指定がないかぎり、Microsoft SQL ServerはMicrosoft SQL Server 7.0、Microsoft SQL Server 2000またはMicrosoft SQL Server 2005を示します。また、Sybase Adaptive Serverは、Sybase Adaptive Server 12または15を示します。

1.2 製品説明

SQL Developerを使用すると、Microsoft SQL ServerまたはSybase Adaptive ServerデータベースをOracle Databaseに移行できます。SQL Developerでは、移行プロセスを簡略化するため、直観的で有益なユーザー・インタフェースを使用しています。

SQL Developerは、リポジトリを使用して、移行情報を格納します。これによって、移行前のアプリケーションの元の状態を問い合せることができます。最初にアプリケーション・システムの移行可能なコンポーネントをリポジトリにロードしておくことによって、本番アプリケーションから切り離して作業できます。

また、SQL Developerは、変換中のコンポーネントの依存性に関する有効な情報を保存します。たとえば、SQL Developerは、ストアド・プロシージャによってアクセスされたすべての表の記録を保存します。この情報を使用して、指定した表を変更した場合の影響を把握できます。

1.3 機能

SQL Developerには、主要となる機能およびMicrosoft SQL ServerおよびSybase Adaptive Serverの移行固有の機能が含まれています。SQL Developerを使用すると、次のことができます。

- Oracle DatabaseへのMicrosoft SQL ServerまたはSybase Adaptive Serverデータベース全体の移行

- Oracleへのグループ、ユーザー、表、主キー、外部キー、一意制約、索引、規則、チェック制約、ビュー、トリガー、ストアド・プロシージャ、ユーザー定義型および権限の移行

- 単一のOracle DatabaseへのMicrosoft SQL ServerまたはSybase Adaptive Serverの複数のソース・データベースの移行

- ストアド・プロシージャ、トリガーまたはビューのパーサーのカスタマイズ

- オフラインでのデータ・ロードのためのOracle SQL*LoaderおよびSQL ServerまたはSybase Adaptive ServerのBCPスクリプトの生成

- ソース・データベースおよび移行先のOracle Databaseの説明の表示

- 移行の概要レポートの生成および表示

- ユーザー、表、索引および表領域のカスタマイズ

- デフォルトのデータ型のマッピング・ルールのカスタマイズ

- ANSI準拠の名前の作成

- Oracleの予約語などの競合の自動解消

- Oracleモデルのオブジェクトの削除およびオブジェクト名の変更

1.4 用語集

SQL Developerの説明では、次の用語が使用されます。

依存性は、2つの移行エンティティ間の関連を定義する場合に使用します。たとえば、データベース・ビューは、データベース・ビューが参照する表に依存します。

宛先データベースは、SQL Developerによるソース・データベースのデータ・ディクショナリの移行先となるOracle Databaseです。

移行コンポーネントは、Oracle Databaseに移行できるアプリケーション・システムの一部です。移行コンポーネントの例として、表やストアド・プロシージャがあります。

移行エンティティは、移行コンポーネントのインスタンスです。EMP表は、移行コンポーネント表に属する移行エンティティです。

移行リポジトリは、SQL Developerがソース・データベースを移行するために必要な永続情報を格納するために使用する、Oracle Databaseに含まれる領域です。

ナビゲータ・ペインは、SQL Developerユーザー・インタフェースの一部で、Source ModelおよびOracle Modelを表示するツリー・ビューを含みます。

Oracle Modelは、Source Modelの情報から作成される一連のOracle Model表です。Oracle環境で生成された場合のソース・データベースが視覚的に表示されます。

プロパティ・ペインは、SQL Developerユーザー・インタフェースの一部で、ナビゲータ・ペインのいずれかのツリー・ビューで選択された移行エンティティのプロパティを表示します。

進捗ウィンドウは、SQL Developerユーザー・インタフェースの一部で、移行プロセスの進捗を示す、情報、エラーまたは警告のメッセージが含まれます。

Software Development Kit(SDK)は、ソフトウェア開発者が使用できるサービスを提供する、明確に定義された一連のアプリケーション・プログラミング・インタフェース(API)です。

ソース・データベースは、SQL Developerによって移行されるアプリケーション・システムのデータ・ディクショナリを含むデータベースです。ソース・データベースはOracle以外のデータベースで、Microsoft SQL Serverなどがあります。

Source Modelは、ソース・データベースのデータ・ディクショナリのレプリカです。Oracle SQL Developer Repositoryに格納され、SQL Developerによってソース・データベースのデータ・ディクショナリの内容とともにロードされます。

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

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

- 2.1 「スキーマの移行」

- 2.2 「データ型」

- 2.3 「データ記憶域の概要」

- 2.4 「データ操作言語」

2.1 スキーマの移行

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

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

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

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

- 表の設計上の考慮事項

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

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

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

Oracle

Microsoft SQL ServerまたはSybase Adaptive Server

データベース

データベース

スキーマ

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

表領域

データベース

ユーザー

ユーザー

ロール

グループ/ロール

表

表

一時表

一時表

クラスタ

なし

列レベルのチェック制約

列レベルのチェック制約

列デフォルト

列デフォルト

一意キー

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

主キー

主キー

外部キー

外部キー

索引

非一意索引

PL/SQLプロシージャ

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

PL/SQLファンクション

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

パッケージ

なし

AFTERトリガー

トリガー

BEFOREトリガー

複合ルール

各行に対するトリガー

なし

シノニム

なし

順序

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

スナップショット

なし

ビュー

ビュー

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

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

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

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

2.1.3 表の設計上の考慮事項

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

- データ型

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

- 参照整合性制約

- 一意キー制約

- チェック制約

2.1.3.1 データ型

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

- DATETIMEデータ型

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

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

2.1.3.1.1 DATETIMEデータ型

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

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

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

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

元の表設計

Microsoft SQL ServerまたはSybase Adaptive Server:

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

Oracle:

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

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

修正された表設計

Microsoft SQL ServerまたはSybase Adaptive Server:

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

Oracle:

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

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

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

CREATE SEQUENCE datetime_seq

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

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

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

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

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

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

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

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

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

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

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

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

2.1.3.3 参照整合性制約

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

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

2.1.3.4 一意キー制約

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

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

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

2.1.3.5 チェック制約

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

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

2.1.3.5.1 Microsoft SQL ServerまたはSybase Adaptive Serverのルール:

create rule phone_rule
as
@phone_number like
"([0-9][0-9][0-9])[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]"

このルールでは、(650)506-7000のような電話番号はすべて渡されます。

このルールでは、次のような電話番号はすべて渡されません。

650-506-7000 650-GET-HELP

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

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

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

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

2.2 データ型

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

- Microsoft SQL ServerまたはSybase Adaptive Serverで使用可能なベース・データ型、およびそのデータ型とOracleのデータ型のマッピングを示す表

- 表に示す情報に基づく推奨事項

2.2.1 データ型の表

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

Microsoft SQL ServerまたはSybase Adaptive Server

説明

Oracle

コメント

INTEGER

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

NUMBER(10)

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

SMALLINT

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

NUMBER(5)

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

TINYINT

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

NUMBER(3)

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

REAL

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

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

FLOAT

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

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

FLOAT

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

FLOAT

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

OracleのNUMBERデータ型は、固定小数点数および浮動小数点数の両方を10進演算に対応する書式で格納するために使用されます。OracleのNUMBER型はFLOATより精度および移植性が高く、また範囲が異なるため、このデータ型で演算を行うと、異なる結果になります。NUMBERデータ型の範囲は、-9.99.99E+125から9.99.99E+125です(38個の9の後に0(ゼロ)が88個続く)。

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

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

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

BIT

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

NUMBER(1)

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

CHAR(n)

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

CHAR(n)

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

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

VARCHAR(n)

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

VARCHAR2(n)

TEXT

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

CLOB

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

IMAGE

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

BLOB

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

BINARY(n)

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

RAW(n)/BLOB

VARBINARY(n)

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

RAW(n)/BLOB

DATETIME

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

DATE

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

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

SMALL-DATETIME

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

DATE

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

MONEY

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

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

NUMBER(19,4)

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

NCHAR(n)

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

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

CHAR(n*2)

NVARCHAR(n)

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

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

VARCHAR(n*2)

SMALLMONEY

前述のMONEYと同じです。ただし、通貨データの値の範囲は、-214,748.3648から+214,748.3647で、精度は通貨単位の1/10,000です。格納サイズは、4バイトです。

NUMBER(10,4)

範囲が-214,748.3648から214,748.364であるため、このフィールドは、NUMBER(10,4)で十分です。

TIMESTAMP

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

NUMBER

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

SYSNAME

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

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

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

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

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

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

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

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

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

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

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

固定長データ型

可変長データ型

CHAR

VARCHAR

NCHAR

NVARCHAR

BINARY

VARBINARY

DATETIME、SMALLDATETIME

DATETIMN

FLOAT

FLOATN

INT、SMALLINT、TINYINT

INTN

DECIMAL

DECIMALN

NUMERIC

NUMERICN

MONEY、SMALLMONEY

MONEYN

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

推奨事項:

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

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

2.3 データ記憶域の概要

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

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

- Microsoft SQL ServerまたはSybase Adaptive ServerデータベースとOracle Databaseのデータ記憶域の概念を比較する表(表2-4)

- 表に示す情報に基づく推奨事項

2.3.1データ記憶域の概要表

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

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

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

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

データファイル:

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

ページ:

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

データ・ブロック:

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

エクステント:

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

エクステント:

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

なし

セグメント:

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

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

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

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

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

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

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

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

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

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

表領域エクステント:

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

表領域セグメント:

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

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

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

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

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

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

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

ログ・デバイス:

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

REDOログ・ファイル:

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

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

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

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

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

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

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

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

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

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

なし

ダンプ・デバイス:

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

なし

なし

制御ファイル:

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

- データベース名

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

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

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

推奨事項:

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

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

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

2.4 データ操作言語

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

- データベースへの接続

- SELECT文

- GROUP BYが指定されたSELECT文

- INSERT文

- UPDATE文

- DELETE文

- 演算子

- 比較演算子

- 算術演算子

- 文字列演算子

- 集合演算子

- ビット演算子

- 組込みファンクション

- 文字ファンクション

- 日付ファンクション

- 算術ファンクション

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

- ロック

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

- 読取り一貫性

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

2.4.1 データベースへの接続

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

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

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

構文:

USE database_name

構文:

CONNECT user_name/password
SET role

説明:

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

推奨事項:

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

2.4.2 SELECT文

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

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

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

構文:

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

構文:

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

説明:

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

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

SELECT getdate()

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

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

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

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

ALIAS = selected_column

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

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

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

説明:

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

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

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

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

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

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

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

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

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

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

SELECT getdate()

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

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

SELECT sysdate FROM dual;

2.4.2.2 SELECT INTO文:

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

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

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

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

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

2.4.2.3 列別名:

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

SELECT employees=col1 FROM tab1e

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

SELECT col1 employees FROM tab1e

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

2.4.2.4 表の別名:

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

2.4.2.5 計算:

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

2.4.3 GROUP BYが指定されたSELECT文

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

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

Microsoft SQL ServerまたはSybase Adaptive Server/Server

Oracle

構文:

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

構文:

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

説明:

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

説明:

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

2.4.4 INSERT文

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

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

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

構文:

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

構文:

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

説明:

INTOはオプションです。

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

説明:

INTOは必須です。

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

推奨事項:

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

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

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

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

2.4.5 UPDATE文

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

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

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

構文:

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

構文:

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

説明:

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

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

説明:

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

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

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

推奨事項:

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

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

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

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

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

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

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

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

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

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

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

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

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

2.4.6 DELETE文

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

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

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

構文:

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

構文:

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

[WHERE where_clause]

説明:

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

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

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

説明:

FROMはオプションです。

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

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

2.4.6.1 2つ目のFROM句の削除:

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

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

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

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

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

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

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

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

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

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

2.4.7 演算子

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

- 比較演算子

- 算術演算子

- 文字列演算子

- 集合演算子

- ビット演算子

2.4.7.1 比較演算子

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

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

演算子

両方のデータベースで共通

Microsoft SQL ServerまたはSybase Adaptive Serverのみ

Oracleのみ

等しい

=

等しくない

!=

<>

^=

未満

<

より大きい

>

以下

<=

!>

以上

>=

!<

x以上およびy以下

BETWEEN x AND y

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

NOT BETWEEN x AND y

パターン一致

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

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

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

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

aの後に%が続く

LIKE 'a%'

LIKE 'a_'

LIKE'a[x-z]'

LIKE'a[^x-z]'

LIKE 'a\%'

ESCAPE '\'

パターン不一致

NOT LIKE

値が存在しない

IS NULL

値が存在する

IS NOT NULL

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

EXISTS (query)

問合せで行が戻されない

NOT EXISTS (query)

メンバーと等しい

IN =ANY

= SOME

メンバーと等しくない

NOT IN != ANY <> ANY

!= SOME <> SOME

メンバー未満

< ANY

< SOME

メンバーより大きい

> ANY

> SOME

メンバー以下

<= ANY

!> ANY

<= SOME

メンバー以上

>= ANY

!< ANY

>= SOME

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

=ALL

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

!= ALL <> ALL

すべてのメンバー未満

< ALL

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

> ALL

すべてのメンバー以下

<= ALL

!> ALL

すべてのメンバー以上

>= ALL

!< ALL

推奨事項:

1. すべての!<と!>を>=と<=に変換します。
次のようなMicrosoft SQL ServerまたはSybase Adaptive Serverの例を変換します。

WHERE col1 !< 100

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

WHERE col1 >= 100

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

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

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

表2-12 NULL構文の変更

NULL構文

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

where col1 = NULL

depends on the data

FALSE

where col1 != NULL

depends on the data

TRUE

where col1 IS NULL

depends on the data

depends on the data

where col1 IS NOT NULL

depends on the data

depends on the data

where NULL = NULL

TRUE

FALSE

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

WHERE col1 = NULL

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

WHERE col1 IS NULL

2.4.7.2 算術演算子

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

演算子

両方のデータベースで共通

Microsoft SQL ServerまたはSybase Adaptive Serverのみ

Oracleのみ

加算

+

減算

-

乗算

*

除算

/

Modulo

v

%

mod(x, y)

推奨事項:

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

2.4.7.3 文字列演算子

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

演算子

両方のデータベースで共通

Microsoft SQL ServerまたはSybase Adaptive Serverのみ

Oracleのみ

連結

s

+

||

リテラルの指定

'文字列'

"文字列"

推奨事項:

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

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

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

2.4.7.4 集合演算子

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

演算子

両方のデータベースで共通

Microsoft SQL ServerまたはSybase Adaptive Serverのみ

Oracleのみ

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

UNION

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

UNION ALL

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

d

INTERSECT

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

d

MINUS

2.4.7.5 ビット演算子

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

演算子

両方のデータベースで共通

Microsoft SQL ServerまたはSybase Adaptive Serverのみ

Oracleのみ

論理積

&

論理和

|

排他的論理和

^

否定

~

推奨事項:

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

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

X | Y :(Bitwise OR)

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

dbms_bits.or(x,y)

2.4.8 組込みファンクション

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

- 文字ファンクション

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

- 日付ファンクション

- 算術ファンクション

2.4.8.1 文字ファンクション

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

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

説明

ascii(char)

ascii(char)

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

char(integer_expression)

chr(integer_expression)

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

charindex(specified_exp, char_string)

instr(specified_exp, char_string, 1, 1)

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

convert(data type, expression, [format])

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

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

datalength(expression)

g

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

difference(character_exp, character_exp)

d

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

isnull(variable, new_value)

nvl(variable, new_value)

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

lower(char_exp)

lower(char_exp)

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

ltrim(char_exp)

ltrim(char_exp)

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

patindex(pattern, column_name)

instr(column_name, pattern)

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

replicate(char_exp, n)

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

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

reverse(char_string)

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

right(char_exp, n)

substr(char_exp, (length(char_exp)

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

rtrim(char_exp)

rtrim(char_exp)

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

soundex(exp)

soundex(exp)

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

space(int_exp)

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

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

str(float_exp, length)

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

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

substring(char_exp, start, length)

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

substring(char_exp, start, length)

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

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

textptr(column_name)

d

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

textvalid("column_name", text_pointer)

h

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

upper(char_exp)

upper(char_exp)

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

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

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

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

説明

datalength(expression)

lengthb

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

isnull(variable, new_value)

nvl(variable, new_value)

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

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

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

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

2.4.8.3 日付ファンクション

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

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

説明

dateadd(dd, int_exp,datetime_var)

date+int_exp
requires conversion of int_exp to a number of days

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

dateadd(mm, int_exp,datetime_var)

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

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

dateadd(yy, int_exp,datetime_var)

date+int_exp
requires conversion of int_exp to a number of days

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

datediff(dd, datetime1,datetime2)

date2-date1

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

datediff(mm, datetime1,datetime2)

months_between               (date2, date1)

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

datediff(yy, datetime1,datetime2)

(date2-date1) /365.254

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

datename (datepart, date)

to_char(date, format)

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

datepart(datepart, date)

to_char(date, format)

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

getdate()

sysdate

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

推奨事項:

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

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

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

2.4.8.4 算術ファンクション

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

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

abs(n)

abs(n)

acos(n)

acos(n)

asin(n)

atan(n)

atan(n)

atn2(n,m)

ceiling(n)

ceil(n)

cos(n)

cos(n)

cot(n)

degrees(n)

exp(n)

exp(n)

floor(n)

floor(n)

log(n)

ln(n)

log10(n)

log(base,number)

pi()

power(m,n)

power(m,n)

radians(n)

rand(n)

round(n[,m])

round(n[,m])

sign(n)

sign(n)

sin(n)

sin(n)

sqrt(n)

sqrt(n)

tan(n)

tan(n)

推奨事項:

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

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

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

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

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

- ロック

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

- 読取り一貫性

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

2.4.9.1 ロック

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

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

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

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

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

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

更新ロック:

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

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

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

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

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

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

行レベル・ロック:

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

意図的ロック:

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

エクステント・ロック:

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

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

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

行共有表ロック(RW):

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

行排他表ロック(RX):

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

共有ロック(SL)

共有行排他ロック(SRX)

排他ロック(X)

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

推奨事項:

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

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

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

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

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

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

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

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

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

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

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

推奨事項:

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

2.4.9.3 読取り一貫性

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

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

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

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

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

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

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

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

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

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

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

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

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

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

SET TRANSACTION READ ONLY

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

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

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

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

BEGIN TRANSACTION [transaction_name]

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

SAVE TRANSACTION savepoint_name

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

ROLLBACK TRAN <savepoint_name>

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

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

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

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

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

SET SAVEPOINT savepoint_name

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

ROLLBACK <savepoint_name>

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

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

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

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

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

推奨事項:

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

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

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

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

この章では、Microsoft SQL ServerまたはSybase Adaptive Serverと、Oracleの違いを説明します。内容は次のとおりです。

- 3.1 「トリガー」

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

- 3.3 「データ型」

- 3.4 「スキーマ・オブジェクト」

- 3.5 「T-SQLとPL/SQLの構文」

- 3.6 「T-SQLとPL/SQLの言語要素」

3.1 トリガー

Microsoft SQL ServerまたはSybase Adaptive Serverのデータベース・トリガーは、AFTERトリガーです。これは、特定の操作を実行した後にトリガーが起動されることを意味します。たとえば、INSERTトリガーは、データベースに行が挿入された後に起動されます。トリガーが正常に起動されない場合は、操作がロールバックされます。

Microsoft SQL ServerまたはSybase Adaptive Serverでは、INSERT、UPDATEおよびDELETEトリガーを使用できます。通常、トリガーは変更中のデータのビフォア・イメージおよびアフター・イメージにアクセスする必要があります。Microsoft SQL ServerまたはSybase Adaptive Serverでは、INSERTEDおよびDELETEDという2つの一時表を使用してこの処理が行われます。これらの2つの表はトリガーの実行中に存在します。これらの表と、トリガーが書き込まれる表は完全に同じ構造をしています。DELETED表にはUPDATE/DELETE操作のために変更されている行のビフォア・イメージが保持され、INSERTED表にはINSERT/UPDATE操作に対応する行のアフター・イメージが保持されます。エラーが発生した場合は、トリガーでロールバック文を発行できます。

Microsoft SQL ServerまたはSybase Adaptive Serverのほぼすべてのトリガーのコードは、参照整合性が適用されます。Microsoft SQL ServerまたはSybase Adaptive Serverのトリガーは、SQL文(INSERT、UPDATE、DELETEなど)を実行するたびに1回実行されます。SQL文の影響を受ける各行に対して特定のアクションが実行されるようにする場合は、INSERTEDおよびDELETED表を使用してそのアクションをコード化する必要があります。

Oracleでは、豊富なトリガーが提供されています。INSERT、UPDATE、DELETEなどのイベントに対して起動されるトリガーもあります。また、トリガー・アクションが実行される回数を指定することもできます。たとえば、トリガーを起動するイベント(多くの行を更新するUPDATEによって起動されるイベントなど)によって影響を受けるすべての行に対して1回、(影響を受ける文の数に関係なく)トリガーを起動する文に対して1回などと指定できます。

ROWトリガーは、トリガーを起動するイベントによって表が影響を受けるたびに起動されます。たとえば、UPDATE文で表の複数の行を更新する場合、ROWトリガーは、UPDATE文によって影響を受ける各行に対して1回起動されます。STATEMENTトリガーは、トリガーを起動する文によって影響を受ける表内の行の数に関係なく、トリガーを起動する文のかわりに1回起動されます。

Oracleのトリガーは、BEFOREトリガーまたはAFTERトリガーのいずれかとして定義できます。BEFOREトリガーは、トリガーを起動する文を完了できるかどうかをトリガー・アクションで判断する場合に使用されます。BEFOREトリガーを使用すると、トリガーを起動する文およびその最終的なロールバックが、例外が発生した場合に必要以上に実行されないようにすることができます。

Oracleには、これらを組み合せた次の4つのタイプのトリガーがあります。

- BEFORE STATEMENTトリガー

- BEFORE ROWトリガー

- AFTER STATEMENTトリガー

- AFTER ROWトリガー

ROWトリガーまたはSTATEMENTトリガーを作成して、Microsoft SQL ServerまたはSybase Adaptive Serverのトリガーと同じ機能を使用できるようにする必要がある場合があります。次に、その場合を示します。

- トリガーを起動するコードがトリガー自体の表(変更表)から読取りを実行する場合

- トリガーを起動するコードにグループ・ファンクションが含まれている場合

次の例では、グループ・ファンクションAVGを使用して平均給与を計算します。

SELECT AVG(inserted.salary)
FROM inserted a, deleted b
WHERE a.id = b.id;

これをOracleに変換するには、更新されたすべての値をパッケージに挿入するAFTER ROWトリガー、およびパッケージから読取りを行い、平均を計算するAFTER STATEMENTを作成します。

Oracleのトリガーの例については、『Oracle Database 2日で開発者ガイド』を参照してください。

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

Microsoft SQL ServerまたはSybase Adaptive Serverでは、トリガーおよびストアド・プロシージャがサーバーとともに格納されます。Oracleでは、トリガーおよびストアド・サブプログラムがサーバーとともに格納されます。Oracleには、3種類の異なるストアド・サブプログラム(ファンクション、ストアド・プロシージャおよびパッケージ)があります。これらすべてのオブジェクトの詳細は、『Oracle Database PL/SQL言語リファレンス』を参照してください。

ストアド・プロシージャを使用すると、サーバーとともに格納可能なアプリケーション・ロジックを有効にコード化できます。ストアド・プロシージャは、Microsoft SQL ServerまたはSybase Adaptive ServerおよびOracleのすべてで利用できます。

これらのオブジェクトのコード化に使用する言語は、SQLに対するデータベース固有の手続き型拡張言語です。この言語は、OracleではPL/SQLで、Microsoft SQL ServerまたはSybase Adaptive ServerではTransact SQL(T-SQL)です。これらの言語は大幅に異なります。個々のSQL文およびプロシージャの構文(if-then-elseなど)は、両方のバージョンの手続き型SQLで類似しています。この項では、両方のバージョンにおける次の項目の相違点を説明します。

- 個々のSQL文

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

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

また、この項では、変換時に問題が発生しないようにするために、Microsoft SQL ServerまたはSybase Adaptive Serverの通常のストアド・プロシージャの各種コンポーネントについて検討し、それらの設計方法を示します。この項で説明する標準をコーディングに適用すると、ストアド・プロシージャをMicrosoft SQL ServerまたはSybase Adaptive ServerからOracleに変換できます。

3.2.1 個々のSQL文

個々のSQL文は、可能なかぎり、ANSI規格のSQLに準拠させる必要があります。ただし、使用が簡単、コーディングが単純、パフォーマンスが向上などの理由から、データベース固有のSQL構文を使用する必要がある場合があります。たとえば、次のようなMicrosoft SQL ServerまたはSybase Adaptive Server構文は、SQL ServerまたはSybase Adaptive Server固有です。

update <table_name>
set ...
from <table1>, <table_name>
where...

次の例には、自動変換ユーティリティによって実行されるこのような文の変換を示します。

3.2.1.1 Microsoft SQL ServerまたはSybase Adaptive Server:

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

3.2.1.2 Oracle:

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

3.2.1.3 Microsoft SQL ServerまたはSybase Adaptive Server:

UPDATE titles
SET price = price + author_royalty
FROM titles, title_author
WHERE titles.title.id = title_author.title_id

3.2.1.4 Oracle:

MERGE INTO titles
USING (SELECT * FROM title_author) title_author
ON ( title.id = title_author.title_id )
WHEN MATCHED THEN UPDATE SET price = price + author_royalty;

ANSI規格のすべてのSQL文は、自動変換ユーティリティを使用してデータベース間で変換できます。

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

Microsoft SQL ServerまたはSybase Adaptive Serverでは、トランザクションの定義は明示的です。これは、個々のSQL文がデフォルトでは論理トランザクションの一部ではないことを意味します。SQL文は、ユーザーがBEGIN TRANSACTION(またはBEGIN TRAN)文を使用して明示的に開始したトランザクションが有効な場合、論理トランザクションに属します。論理トランザクションは、対応するCOMMIT TRANSACTION(またはCOMMIT TRAN)あるいはROLLBACK TRANSACTION(またはROLLBACK TRAN)文で終了します。論理トランザクションの一部ではない各SQL文は、完了時にコミットされます。

Oracleでは、トランザクションは、ANSI規格に準拠しているため暗黙的です。暗黙的トランザクション・モデルでは、各SQL文が論理トランザクションの一部である必要があります。COMMITまたはROLLBACKコマンドを実行すると、新しい論理トランザクションが自動的に開始されます。また、これは、個々のSQL文からのデータの変更が実行後データベースにコミットされないことを意味します。この変更は、COMMIT文を実行した場合にのみデータベースにコミットされます。トランザクション・モデルの違いは、アプリケーション・プロシージャのコーディングに影響します。

3.2.2.1 トランザクション処理文

クライアント/サーバー・アプリケーションでは、トランザクション処理の構文をクライアント・プロシージャの一部にすることをお薦めします。論理トランザクションは、常に、クライアント・ユーザーが定義および制御する必要があります。この方針は、2フェーズ・コミット操作が必要な分散トランザクションにも適用されます。トランザクション処理文をクライアント・コードの一部にすることには、2つの目的があります。サーバー・コードの移植性を高めること、および分散トランザクションをサーバー・コードに依存しないようにすることです。BEGIN TRAN、ROLLBACK TRANおよびCOMMIT TRAN文は、ストアド・プロシージャでは使用しないようにしてください。Microsoft SQL ServerまたはSybase Adaptive Serverでは、トランザクションは明示的です。Oracleでは、トランザクションは暗黙的です。トランザクションがクライアントによって処理される場合は、サーバーに存在するアプリケーション・コードを、トランザクション・モデルに依存しないようにすることができます。

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

OracleのPL/SQLでは、次の文に進む前に各SQL文のエラーが確認されます。エラーが発生すると、すぐに制御が例外ハンドラに渡されます。これによって、すべてのSQL文の状態を確認する必要がなくなります。たとえば、SELECT文でデータベース内の行が検出されない場合は、例外が発生し、このエラーを処理するコードが実行されます。

Microsoft SQL ServerまたはSybase Adaptive Serverでは、SQL文を実行するたびにエラーは確認されません。前の文によって生成されたエラー状態に関係なく、制御が次の文に渡されます。そのため、SQL文を実行するたびに、ユーザー自身がエラーを確認する必要があります。確認しないと、誤った結果が戻される場合があります。

Oracleで、Microsoft SQL ServerまたはSybase Adaptive Serverの動作をシミュレートし、前のSQL文の実行状態に関係なく制御を次の文に渡すには、各SQL文を、同様に動作するPL/SQLブロックで囲む必要があります。このブロックによって、そのSQL文で発生する可能性があるすべての例外を処理する必要があります。このコーディング・スタイルは、Microsoft SQL ServerまたはSybase Adaptive Serverの動作をシミュレートする場合にのみ必要です。OracleのPL/SQLプロシージャに1つのみの例外ブロックを含め、そのブロックですべてのエラー状態を処理することをお薦めします。

Microsoft SQL ServerまたはSybase Adaptive Serverストアド・プロシージャで次のコードを実行するとします。

begin

select @x = col1 from table1 where col2 = @y
select @z = col3 from table2 where col4 = @x

end

このコード例では、最初のSELECT文が行を戻さない場合、値@xがUNDEFINEDになります。例外が発生せずに制御が次の文に渡されると、2番目の文では、最初の文によって値@xが設定されている必要があるため、不適切な結果が戻されます。同様の状況で、最初の文が正常に実行されないと、OracleのPL/SQLではNO_DATA_FOUND例外が発生します。

3.2.3.1 RAISERROR文

Microsoft SQL ServerまたはSybase Adaptive ServerのRAISERROR文は、コール元のルーチンに戻されません。エラー・コードおよびエラー・メッセージがクライアントに渡され、ストアド・プロシージャは続行されます。OracleのRAISE_APPLICATION_ERROR文は、コール元のルーチンに戻されます。通常、RETURN文は、Microsoft SQL ServerまたはSybase Adaptive ServerではRAISERROR文の後に指定する必要があるため、OracleのRAISE_APPLICATION_ERROR文に変換できます。

3.2.3.2 エラー・メッセージのカスタマイズ

Microsoft SQL ServerまたはSybase Adaptive Serverでは、システム表を使用してエラー・メッセージをカスタマイズできます。システム・プロシージャを使用して、エラー・メッセージをシステムに追加できます。Oracleシステムに同等の機能がないため、エラー・メッセージは、Microsoft SQL ServerまたはSybase Adaptive Serverのシステム表には追加しないことをお薦めします。中央データベースにあるユーザー定義のエラー・メッセージ表をメンテナンスすることで、この操作を行う必要がなくなります。標準ルーチンは、エラー・メッセージを表に追加して必要に応じて取得できるように作成できます。この方法には、2つの目的があります。異なるタイプのデータベース・サーバー間でのシステムの移植性を高めること、および管理者がエラー・メッセージを集中制御できるようにすることです。

3.3 データ型

この項では、データ型に関する次の項目について説明します。

- ローカル変数

- サーバー・データ型

- 複合データ型

3.3.1 ローカル変数

T-SQLのローカル変数は、TEXTおよびIMAGE以外の任意のデータ型にできます。PL/SQLのローカル変数は、任意のデータ型にできます。次に例を示します。

- BINARY_INTEGER

- BOOLEAN

また、PL/SQLのローカル変数は、PL/SQLで使用可能な次の複合データ型のいずれかにできます。

- RECORD

- TABLE

3.3.2 サーバー・データ型

Microsoft SQL ServerまたはSybase Adaptive Serverのデータ型およびそれらに相当するOracleのデータ型のリストは、「データ型」を参照してください。

3.3.3 複合データ型

Microsoft SQL ServerまたはSybase Adaptive Serverには、複合データ型はありません。

表3-1 Oracleの複合データ型

Oracle

コメント

RECORD

変数をRECORD型と宣言できます。レコードには、一意に名前が付けられたフィールドがあります。型が異なり、論理的に関連するデータを論理ユニットとしてまとめて保存できます。

TABLE

PL/SQL表には1つの列および主キーを含めることができます。いずれも名前を付けることはできません。この列は、任意のスカラー・データ型に属します。主キーはBINARY_INTEGER型にする必要があります。

3.4 スキーマ・オブジェクト

この項では、Microsoft SQL ServerまたはSybase Adaptive ServerとOracleの次のスキーマ・オブジェクトを比較します。

- プロシージャ

- ファンクション

- パッケージ

- パッケージ本体

各スキーマ・オブジェクトの作成、削除、実行および変更(該当する場合)について個別の表で比較します。次のセクションに分類して説明します。

- 構文

- 説明

- 権限

- 例

一部の表では、変換による影響の重要な情報を含む推奨事項のセクションが後に続きます。

3.4.1 プロシージャ

この項では、プロシージャの次の操作について説明します。

- 作成

- 削除

- 実行

- 変更

3.4.1.1 作成

表3-2 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverでのプロシージャ・スキーマ・オブジェクトの作成方法の比較

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

構文:

CREATE PROCEDURE procedure [@formal_parameter formal_parameter_data type  [= default_value] [OUTPUT] [,@formal_parameter formal_parameter_data type [= default_value] [OUTPUT]] ...

AS BEGIN] procedural_statements [END]

構文:

CREATE [OR REPLACE] PROCEDURE [schema.]procedure [(]                        [formal_parameter [IN | OUT | IN OUT]         formal_parameter_data type] [DEFAULT default_value]  [,formal_parameter             [IN | OUT | IN OUT]formal_parameter_data type] [DEFAULT default_value]] ...   [)]                             IS | AS                    [local_variable data type;]... BEGIN                       PL/SQL statements | PL/SQL blocks      END;

説明:

CREATE PROCEDURE文は、名前付きのストアド・プロシージャをデータベースに作成します。

オプションで、プロシージャにOUTPUTとして渡されるパラメータを指定できます。OUTPUT変数の値は、プロシージャの実行後、コール元のルーチンで使用できます。OUTPUTキーワードなしで指定されたパラメータは、入力パラメータとみなされます。

キーワードASは、プロシージャ本体の開始点を示します。

ストアド・プロシージャ本体を囲むBEGINおよびENDキーワードはオプションです。ファイル内のASの後に含まれているすべてのプロシージャ文は、BEGINおよびENDがブロックのマークに使用されていない場合、ストアド・プロシージャの一部とみなされます。

T-SQLプロシージャで使用可能な構文の詳細は、この章の「T-SQLおよびPL/SQLの言語要素」の項を参照してください。

説明:

OR REPLACEキーワードは、プロシージャがすでに存在している場合は、新しい定義で置き換えます。

PL/SQLプロシージャに渡されるパラメータは、IN(入力)、OUT(出力のみ)またはIN OUT(入出力)と指定できます。これらのキーワードを指定しない場合、このパラメータはINと想定されます。

キーワードISは、プロシージャの開始点を示します。ローカル変数は、キーワードISまたはASとキーワードBEGINの間で宣言します。

BEGINキーワードとENDキーワードは、プロシージャ本体を囲みます。

権限:

ストアド・プロシージャを作成するには、CREATE PROCEDUREシステム権限が必要です。Microsoft SQL Server 2005の場合は、ファンクションが作成されているスキーマに対するALTER権限も必要です。

権限:

自分のスキーマにプロシージャを作成するには、CREATE PROCEDUREシステム権限が必要です。別のユーザーのスキーマにプロシージャを作成するには、CREATE ANY PROCEDUREシステム権限が必要です。

推奨事項:

T-SQLプロシージャとPL/SQLプロシージャの構造の機能的に同一の部分を識別することができます。したがって、ほぼすべての構文をMicrosoft SQL ServerまたはSybase Adaptive ServerからOracleへ自動的に変換できます。

OracleのCREATE PROCEDURE文にOR REPLACEキーワードを使用すると、効率的にプロシージャを再作成できます。Microsoft SQL ServerまたはSybase Adaptive Serverでは、プロシージャを明示的に削除した後で置き換える必要があります。

3.4.1.2 削除

表3-3 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverでのプロシージャ・スキーマ・オブジェクトの削除方法の比較

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

構文:

DROP PROCEDURE procedure

構文:

DROP PROCEDURE [schema.]procedure

説明:

プロシージャの定義がデータ・ディクショナリから削除されます。このプロシージャを参照するすべてのオブジェクトで、このプロシージャへの参照を削除する必要があります。

説明:

プロシージャが削除されると、削除されたプロシージャを参照するすべてのローカル・オブジェクトが無効になります。

権限:

プロシージャ所有者は、所有者自身のプロシージャを削除できます。DBOは、すべてのプロシージャを削除できます。

権限:

このコマンドを実行するには、プロシージャがユーザーのスキーマに存在するか、またはユーザーがDROP ANY PROCEDUREシステム権限を所有している必要があります。

例:

DROP PROCEDURE myproc

例:

DROP PROCEDURE sam.credit;

推奨事項:

前述の文は、変換処理には影響しません。この情報は、参照用にのみ提供されています。

3.4.1.3 実行

OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverでのプロシージャ・スキーマ・オブジェクトの実行方法の比較

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

構文:

EXEC [@return_value = ] procedure [[@formal_parameter = ] {@actual_parameter | constant_literal} [OUTPUT]] [,[[@formal_parameter = ] {@actual_parameter | constant_literal} [OUTPUT]]] ...

構文:

procedure
[([{actual_parameter |
constant_literal |
formal_parameter =>
{actual_parameter |
constant_literal}
}]
[,{actual_parameter |
constant_literal |
formal_parameter =>
{actual_parameter |
constant_literal}
}] ....
)]

説明:

Microsoft SQL ServerまたはSybase Adaptive Serverのストアド・プロシージャは、RETURN文を使用して、コール元のルーチンに整数値のみを戻すことができます。RETURN文を使用しない場合でも、ストアド・プロシージャはコール元のルーチンに戻り状態を戻します。この値は、return_value変数で取得できます。

formal_parameterは、プロシージャの定義内のパラメータです。actual_parameterは、実パラメータの値をそれぞれの仮パラメータに代入してプロシージャをコールするローカル・ブロックに定義されます。実パラメータと仮パラメータの対応付けは、位置表記法または名前表記法のいずれかを使用して指定できます。

説明:

OracleのPL/SQLプロシージャは、OUTパラメータによってコール元のルーチンにデータを戻します。Oracleでは、スキーマ・オブジェクトの型が異なるファンクションが提供されています。ファンクションは、RETURN文を使用してコール元のルーチンにアトム型の値を戻すことができます。RETURN文は、任意のデータ型の値を戻すことができます。

formal_parameterは、プロシージャの定義内のパラメータです。actual_parameterは、実パラメータの値をそれぞれの仮パラメータに代入してプロシージャをコールするローカル・ブロックに定義されます。実パラメータと仮パラメータの対応付けは、位置表記法または名前表記法のいずれかを使用して指定できます。

位置表記法: 実パラメータは、プロシージャの定義内の仮パラメータと同じ順序でプロシージャに適用されます。

名前表記法: 実パラメータは、仮パラメータの名前を次のように使用して、プロシージャの定義内の仮パラメータの順序とは異なる順序でプロシージャに適用されます。

@formal_parameter = @actual_parameter

定数リテラルは、次の位置に指定できます。

'@actual_parameter ' as:
@formal_parameter = 10

@formal_parameter = 10

キーワードOUTPUTは、プロシージャでそのパラメータの値をコール元のルーチンにOUTPUTとして戻す必要がある場合に指定する必要があります。

位置表記法: 実パラメータは、プロシージャの定義内の仮パラメータと同じ順序でプロシージャに適用されます。

名前表記法: 実パラメータは、仮パラメータの名前を次のように使用して、プロシージャの定義内の仮パラメータの順序とは異なる順序でプロシージャに適用されます。

formal_parameter => actual_parameter

定数リテラルは、次の位置に指定できます。

as:
formal_parameter => 10

formal_parameterがプロシージャの定義内にOUTまたはIN OUTとして指定されている場合は、プロシージャの実行後、その値をコール元のルーチンで使用できます。

権限:

ユーザーは、ストアド・プロシージャに対するEXECUTE権限を所有している必要があります。ストアド・プロシージャ内で参照される、基礎となるオブジェクトにアクセスするための明示的な権限は必要ありません。

権限

ユーザーは、名前付きのプロシージャに対するEXECUTE権限を所有している必要があります。PL/SQLプロシージャ内で参照される、基礎となるオブジェクトにアクセスするための明示的な権限は必要ありません。

例:

位置表記法:

EXEC GetEmplName @EmpID
EXEC @status = GetAllDeptCodes
EXEC @status =  UpdateEmpSalary @EmpID,
@EmpName
EXEC UpdateEmpSalary 13000,'Joe Richards'

名前表記法:

EXEC UpdateEmpSalary
@Employee = @EmpName,
@Employee_Id = @EmpID

混合表記法:

EXEC UpdateEmpSalary
@EmpName, @Employee_Id = @EmpID
EXEC UpdateEmpSalary
@Employee = @EmpName, @EmpID

例:

位置表記法:

credit (accno, accname, amt, retstat);

名前表記法:

credit (acc_no => accno, acc => accname, amount => amt,
return_status => retstat)

混合表記法(位置表記法を名前表記法より先に指定する必要があります):

credit (accno, accname, amount => amt, return_status => retstat)

3.4.1.4 変更

表3-5 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverでのプロシージャ・スキーマ・オブジェクトの変更方法の比較

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

構文:

Microsoft SQL Serverのみ。Sybase Adaptive Serverでは、ALTER PROCEDURE文は提供されません。

ALTER PROCEDURE procedure_name
[ @parameter data_type [ = default ] [ OUTPUT ]
[, @parameter data_type [ = default ] [ OUTPUT ]] …
]
[ WITH
{ RECOMPILE | ENCRYPTION
| RECOMPILE , ENCRYPTION
}
]
[ FOR REPLICATION ]
AS
[BEGIN]
Statements
[END]

システム・プロシージャSP_RECOMPILEは、名前付きのストアド・プロシージャを再コンパイルします。例:

ALTER PROCEDURE update_employee_salary
@employee_id INT, @salary FLOAT
AS
UPDATE employee
SET salary = @salary
WHERE employee_id = @employee_id;

sp_recompileシステム・ストアド・プロシージャを使用してプロシージャを再コンパイルするには、次のようにします。

sp_recompile my_proc

構文:

ALTER PROCEDURE [schema.]procedure COMPILE

説明:

このコマンドを実行すると、プロシージャが再コンパイルされます。なんらかの理由で無効になっているプロシージャは、このコマンドを使用して明示的に再コンパイルする必要があります。

説明:

このコマンドを実行すると、プロシージャが再コンパイルされます。なんらかの理由で無効になっているプロシージャは、このコマンドを使用して明示的に再コンパイルする必要があります。明示的に再コンパイルすることによって、暗黙的に再コンパイルする必要がなくなるため、それに関連する実行時コンパイル・エラーおよびパフォーマンス上のオーバーヘッドの発生を防止できます。

権限:

このコマンドを発行できるのは、プロシージャの所有者です。

権限:

このコマンドを使用するには、プロシージャがユーザーのスキーマに存在するか、またはユーザーがALTER ANY PROCEDURE権限を所有している必要があります。

例:

sp_recompile my_proc

例:

ALTER PROCEDURE sam.credit COMPILE;

3.4.2 ファンクション

この項では、ファンクションの次の操作について説明します。

- 作成

- 削除

- 実行

- 変更

3.4.2.1 作成

表3-6 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverでのファンクション・スキーマ・オブジェクトの作成方法の比較

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

構文:

Microsoft SQL ServerまたはSybase Adaptive Serverでは、ストアド・プロシージャでRETURN文を使用してコール元のルーチンに整数値を戻すことができるため、ストアド・プロシージャをOracleのファンクションに変換できます。ストアド・プロシージャは、RETURN文を使用しない場合でも、コール元のルーチンに状態値を戻します。戻される状態は、プロシージャが正常に実行され場合はZERO、なんらかの理由で正常に実行されなかった場合はNON-ZEROと同等になります。RETURN文は、整数値のみを戻すことができます。

構文:

CREATE [OR REPLACE] FUNCTION [user.]function [(parameter [OUT] data type[,(parameter [IN OUT] data type]...)]
RETURN data type {IS|AS} block

なし

説明:

OR REPLACEキーワードは、ファンクションがすでに存在している場合は、新しい定義で置き換えます。

PL/SQLファンクションに渡されるパラメータは、IN(入力)、OUT(出力)またはIN OUT(入出力)と指定できます。これらのキーワードを指定しない場合、このパラメータはINと想定されます。

RETURNデータ型は、ファンクションの戻り値のデータ型を指定します。データ型には、PL/SQLでサポートされている任意のデータ型を指定できます。データ型の詳細は、「データ型」を参照してください。

なし

権限:

自分のスキーマにファンクションを作成するには、CREATE PROCEDUREシステム権限が必要です。別のユーザーのスキーマにファンクションを作成するには、CREATE ANY PROCEDUREシステム権限が必要です。

なし

例:

CREATE FUNCTION get_bal
(acc_no IN NUMBER)
RETURN  NUMBER
IS
acc_bal NUMBER(11,12);
BEGIN
SELECT balance
INTO acc_bal
FROM accounts
WHERE account_id = acc_no;
RETURN(acc_bal);
END;

3.4.2.2 削除

表3-7 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverでのファンクション・スキーマ・オブジェクトの削除方法の比較

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

なし

構文:

DROP FUNCTION [schema.]function

なし

説明:

ファンクションが削除されると、削除されたファンクションを参照するすべてのローカル・オブジェクトが無効になります。

なし

権限:

このコマンドを実行するには、ファンクションがユーザーのスキーマに存在するか、またはユーザーがDROP ANY PROCEDUREシステム権限を所有している必要があります。

なし

例:

DROP FUNCTION sam.credit;

3.4.2.3 実行

表3-8 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverでのファンクション・スキーマ・オブジェクトの実行方法の比較

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

なし

構文:

function [({actual_parameter | constant_literal}...)]

なし

説明:

ファンクションは、RETURN文を使用してコール元のルーチンにアトム型の値を戻すことができます。

ファンクションは、式の一部としてコールできます。これは、非常に優れた概念です。Microsoft SQL ServerまたはSybase Adaptive Serverのすべての組込みファンクションは、PL/SQLを使用してコード化できます。これらのファンクションは、Oracleを使用して起動し、式内の他の組込みファンクション同様にコールできます。

なし

権限:

名前付きのファンクションを実行するには、そのファンクションに対するEXECUTE権限が必要です。PL/SQLファンクション内で参照される、基礎となるオブジェクトにアクセスするための明示的な権限は必要ありません。

なし

例:

1) IF sal_ok (new_sal, new_title) THEN
....
END IF;

2) promotable:=
sal_ok(new_sal, new_title) AND
(rating>3);

ここで、sal_okはBOOLEAN値を戻すファンクションです。

3.4.2.4 変更

表3-9 OracleとMicrosoft SQL ServerまたはSybase Adaptive Server 7.0でのファンクション・スキーマ・オブジェクトの変更方法の比較

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

なし

構文:

ALTER FUNCTION [schema.]function COMPILE

なし

説明:

このコマンドを実行すると、ファンクションが再コンパイルされます。ファンクションは、ファンクション内から参照されるオブジェクトが削除または変更されると無効になります。なんらかの理由で無効になっているファンクションは、このコマンドを使用して明示的に再コンパイルする必要があります。明示的に再コンパイルすることによって、暗黙的に再コンパイルする必要がなくなるため、それに関連する実行時コンパイル・エラーおよびパフォーマンス上のオーバーヘッドの発生を防止できます。

なし

権限:

このコマンドを使用するには、ファンクションがユーザーのスキーマに存在するか、またはユーザーがALTER ANY PROCEDURE権限を所有している必要があります。

なし

例:

ALTER FUNCTION sam.credit COMPILE

3.4.3 パッケージ

この項では、パッケージの次の操作について説明します。

- 作成

- 削除

- 変更

3.4.3.1 作成

表3-10 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverでのパッケージ・スキーマ・オブジェクトの作成方法の比較

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

構文:

パッケージは、Microsoft SQL ServerまたはSybase Adaptive Serverではサポートされていません。

構文:

CREATE [OR REPLACE] PACKAGE [user.]package {IS | AS} {variable_declaration | cursor_specification | exception_declaration | record_declaration | plsql_table_declaration | procedure_specification | function_specification | [{variable_declaration | cursor_specification | exception_declaration | record_declaration | plsql_table_declaration | procedure_specification | function_specification}; ]...}        END [package]

なし

説明:

これは、パッケージの外部(公開部分)です。

CREATE PACKAGEは、プロシージャ、ファンクション、例外、変数、定数およびカーソルのグループとして構成できるPL/SQLパッケージの仕様部を設定します。

パッケージのファンクションおよびプロシージャは、変数、定数およびカーソルを介してデータを共有できます。

OR REPLACEキーワードは、パッケージがすでに存在している場合は、新しい定義で置き換えます。これを行うには、パッケージおよびパッケージ仕様部に依存するすべてのオブジェクトを再コンパイルする必要があります。

なし

権限:

自分のスキーマにパッケージを作成するには、CREATE PROCEDUREシステム権限が必要です。別のユーザーのスキーマにパッケージを作成するには、CREATE ANY PROCEDUREシステム権限が必要です。

なし

例:

CREATE PACKAGE emp_actions AS
-- specification
TYPE EmpRecTyp IS RECORD (emp_id INTEGER, salary REAL);
CURSOR desc_salary (emp_id NUMBER) RETURN EmpRecTyp;

PROCEDURE hire_employee
(ename CHAR,
job CHAR,
mgr NUMBER,
sal NUMBER,
comm NUMBER,
deptno NUMBER);
PROCEDURE fire-employee (emp_id NUMBER);
END emp_actions;

3.4.3.2 削除

表3-11 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverでのパッケージ・スキーマ・オブジェクトの削除方法の比較

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

構文:

パッケージは、Microsoft SQL ServerまたはSybase Adaptive Serverではサポートされていません。

構文:

DROP PACKAGE [BODY] [schema.]package

なし

説明:

BODYオプションを指定すると、パッケージ本体のみが削除されます。BODYを指定しない場合は、パッケージの本体と仕様部の両方が削除されます。パッケージの本体および仕様部を削除すると、パッケージ仕様部に依存するすべてのローカル・オブジェクトが無効になります。

schema.は、パッケージが含まれているスキーマです。schema.を指定しない場合は、パッケージが自分のスキーマに存在すると想定されます。

パッケージが削除されると、削除されたパッケージを参照するすべてのローカル・オブジェクトが無効になります。

なし

権限:

このコマンドを実行するには、パッケージがユーザーのスキーマに存在するか、またはユーザーがDROP ANY PROCEDUREシステム権限を所有している必要があります。

なし

例:

DROP PACKAGE emp_actions;

3.4.3.3 変更

表3-12 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverでのパッケージ・スキーマ・オブジェクトの変更方法の比較

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

構文:

パッケージは、Microsoft SQL ServerまたはSybase Adaptive Serverではサポートされていません。

構文:

ALTER PACKAGE [user.]package COMPILE [PACKAGE | BODY]

なし

説明:

なんらかの理由で無効になっているパッケージは、このコマンドを使用して明示的に再コンパイルする必要があります。

このコマンドを実行すると、すべてのパッケージ・オブジェクトがまとめて再コンパイルされます。ALTER PROCEDUREまたはALTER FUNCTIONコマンドを使用して、パッケージの一部であるプロシージャまたはファンクションを個々に再コンパイルすることはできません。

PACKAGE(デフォルトのオプション)を指定すると、パッケージの本体および仕様部が再コンパイルされます。

BODYを指定すると、パッケージ本体のみが再コンパイルされます。

明示的に再コンパイルすることによって、暗黙的に再コンパイルする必要がなくなるため、それに関連する実行時コンパイル・エラーおよびパフォーマンス上のオーバーヘッドの発生を防止できます。

なし

権限:

このコマンドを使用するには、パッケージがユーザーのスキーマに存在するか、またはユーザーがALTER ANY PROCEDURE権限を所有している必要があります。

なし

例:

ALTER PACKAGE emp_actions COMPILE PACKAGE

3.4.4 パッケージ本体

この項では、パッケージ本体の次の操作について説明します。

- 作成

- 削除

- 変更

3.4.4.1 作成

表3-13 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverでのパッケージ本体スキーマ・オブジェクトの作成方法の比較

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

構文:

パッケージは、Microsoft SQL ServerまたはSybase Adaptive Serverではサポートされていません。

構文:

CREATE [OR REPLACE] PACKAGE BODY [schema.]package                               {IS | AS} pl/sql_package_body

なし

説明:

これは、パッケージの内部(非公開部分)です。

CREATE PACKAGEは、ストアド・パッケージの本体を作成します。

OR REPLACEは、パッケージ本体がすでに存在する場合、再作成します。パッケージ本体は、変更すると再コンパイルされます。

schema.は、パッケージを含むスキーマです。これを指定しない場合、パッケージは現行のスキーマに作成されます。

packageは、作成されるパッケージです。

pl/sql_package_bodyは、プログラム・オブジェクトを宣言および定義できるパッケージ本体です。パッケージ本体の記述の詳細は、『Oracle Database PL/SQL言語リファレンス』を参照してください。

なし

権限:

自分のスキーマにパッケージを作成するには、CREATE PROCEDURE権限が必要です。別のユーザーのスキーマにパッケージを作成するには、CREATE ANY PROCEDURE権限が必要です。

なし

例:

CREATE PACKAGE BODY emp_actions AS
-- body
CURSOR desc_salary (emp_id NUMBER)
RETURN EmpRecTyp IS
SELECT empno, sal FROM emp
ORDER BY sal DESC;
PROCEDURE hire_employee
(ename    CHAR,
job      CHAR,
mgr      NUMBER,
sal      NUMBER,
comm     NUMBER,
deptno   NUMBER) IS
BEGIN
INSERT INTO emp VALUES
(empno_seq.NEXTVAL, ename,
job, mgr, SYSDATE, sal,
comm, deptno);
END hire_employee;

PROCEDURE fire_employee
(emp_id   NUMBER) IS
BEGIN
DELETE FROM emp
WHERE empno = emp_id;
END fire_employee;

END emp_actions;

3.4.4.2 削除

表3-14 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverでのパッケージ本体スキーマ・オブジェクトの削除方法の比較

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

構文:

パッケージは、Microsoft SQL ServerまたはSybase Adaptive Serverではサポートされていません。

構文:

DROP PACKAGE [BODY] [schema.]package

なし

説明:

BODYオプションを指定すると、パッケージ本体のみが削除されます。BODYを指定しない場合は、パッケージの本体と仕様部の両方が削除されます。パッケージの本体および仕様部を削除すると、パッケージ仕様部に依存するすべてのローカル・オブジェクトが無効になります。

schema.は、パッケージが含まれているスキーマです。schema.を指定しない場合は、パッケージが自分のスキーマに存在すると想定されます。

パッケージが削除されると、削除されたパッケージを参照するすべてのローカル・オブジェクトが無効になります。

なし

権限:

このコマンドを実行するには、パッケージがユーザーのスキーマに存在するか、またはユーザーがDROP ANY PROCEDUREシステム権限を所有している必要があります。

なし

例:

DROP PACKAGE BODY emp_actions;

3.4.4.3 変更

表3-15 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverでのパッケージ本体スキーマ・オブジェクトの変更方法の比較

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

構文:

パッケージは、Microsoft SQL ServerまたはSybase Adaptive Serverではサポートされていません。

構文:

ALTER PACKAGE [user.]package COMPILE [PACKAGE | BODY]

なし

説明:

なんらかの理由で無効になっているパッケージは、このコマンドを使用して明示的に再コンパイルする必要があります。

このコマンドを実行すると、すべてのパッケージ・オブジェクトがまとめて再コンパイルされます。ALTER PROCEDUREまたはALTER FUNCTIONコマンドを使用して、パッケージの一部であるプロシージャまたはファンクションを個々に再コンパイルすることはできません。

PACKAGE(デフォルトのオプション)を指定すると、パッケージの本体および仕様部が再コンパイルされます。

BODYを指定すると、パッケージ本体のみが再コンパイルされます。

明示的に再コンパイルすることによって、暗黙的に再コンパイルする必要がなくなるため、それに関連する実行時コンパイル・エラーおよびパフォーマンス上のオーバーヘッドの発生を防止できます。

なし

権限:

このコマンドを使用するには、パッケージが自分のスキーマであるか、またはユーザーがALTER ANY PROCEDURE権限を所有している必要があります。

なし

例:

ALTER PACKAGE emp_actions COMPILE BODY

3.5 T-SQLとPL/SQLの構文

この項では、Microsoft SQL ServerまたはSybase Adaptive Serverの構文、およびそれに相当し、SQL Developerで生成されるOracleの構文について説明します。次の構文の変換について説明します。

- CREATE PROCEDURE文

- パラメータの受渡し

- DECLARE文

- IF文

- RETURN文

- RAISERROR文

- EXECUTE文

- WHILE文

- GOTO文

- @@Rowcountおよび@@Error変数

- ASSIGNMENT文

- GROUP BY句が指定されたSELECT文

- 列別名

- FROMが指定されたUPDATE文

- FROMが指定されたDELETE文

- 一時表

- カーソル処理

表には、Microsoft SQL ServerまたはSybase Adaptive Serverの構文、およびそれらに相当するOracleの構文を示します。また、変換に関する考慮点についてのコメントも示します。

Oracleの列に示すプロシージャは、SQL Developerによって直接出力されます。通常、SQL Developerは、次のいずれかの方法でMicrosoft SQL ServerまたはSybase Adaptive ServerのT-SQL構文を処理します。

- ANSI規格のSQL文がサポートされているため、そのようなSQL文はPL/SQLに変換されます。

- Microsoft SQL ServerまたはSybase Adaptive Server固有の構文は、PL/SQLで同等の構文が使用可能な場合、PL/SQL構文に変換されます。

- 一部のMicrosoft SQL ServerまたはSybase Adaptive Server固有の構文は無視され、適切なコメントが出力ファイルに組み込まれます。

- 手動で変換する必要がある構文は、出力ファイル内に適切なコメントでラップされます。

- 構文エラーが発生するMicrosoft SQL ServerまたはSybase Adaptive Server固有の構文の場合は、行番号を含む適切なエラー・メッセージが表示されます。

3.5.1 CREATE PROCEDURE文

表3-16 OracleとMicrosoft SQL ServerまたはSybase Adaptive ServerのCREATE PROCEDURE文の比較

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

CREATE PROC proc1
AS
RETURN 0

CREATE OR REPLACE FUNCTION proc1 RETURN NUMBER
AS
BEGIN
RETURN 0;
END;

コメント

プロシージャ、ファンクションまたはパッケージがすでに存在している場合、REPLACEキーワードはそれらを置き換えるために追加されます。

プロシージャは、値を戻すため、Oracleのファンクションに変換されます。

3.5.2 パラメータの受渡し

表3-17 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverのパラメータの受渡しの比較

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

CREATE PROC proc1
@x int=-1,
@y money,
@z bit OUT,
@a char(20) = 'TEST'
AS
RETURN 0

CREATE OR REPLACE FUNCTION proc1
(
v_x IN NUMBER DEFAULT -1,
v_y IN NUMBER,
v_z OUT NUMBER,
v_a IN CHAR DEFAULT 'TEST'
)
RETURN NUMBER
AS
BEGIN
RETURN 0;
END;

コメント

パラメータの受渡しは、Microsoft SQL ServerまたはSybase Adaptive ServerとOracleでほぼ同じです。デフォルトでは、特別に指定されていないかぎり、すべてのパラメータがINPUTパラメータです。

INPUTパラメータは、PL/SQLプロシージャ内からは変更できません。このため、INPUTパラメータは、値を割り当てることも、別のプロシージャにOUTパラメータとして渡すこともできません。Oracleでは、INパラメータにのみデフォルトの値を割り当てることができます。

Oracleでは、パラメータ名宣言内の@マークは削除されます。

Oracleでは、パラメータのデータ型定義に長さ/サイズは含まれません。

Microsoft SQL ServerまたはSybase Adaptive Serverのデータ型は、Oracleベースのデータ型に変換されます。たとえば、Oracleでは、Microsoft SQL ServerまたはSybase Adaptive Serverのすべての数値データ型はNUMBERに、すべての英数字データはVARCHAR2およびCHARに変換されます。

3.5.3 DECLARE文

表3-18 OracleとMicrosoft SQL ServerまたはSybase Adaptive ServerのDECLARE文の比較

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

CREATE PROC proc1
AS
DECLARE
@x int,
@y money,
@z bit,
@a char(20)
RETURN 0
GO

CREATE OR REPLACE PROCEDURE proc1
AS
v_x NUMBER(10,0);
v_y NUMBER(19,2);
v_z NUMBER(1,0);
v_a CHAR(20);
BEGIN
RETURN;
END;

コメント

ローカル変数を宣言する場合、Microsoft SQL ServerまたはSybase Adaptive ServerとOracleは同様のルールに従います。

変数宣言の有効範囲規則は、SQL Developerによって上書きされます。そのため、Oracleでは、すべてのローカル変数はパッケージ本体の最上位に定義されます。

3.5.4 IF文

表3-19 OracleとMicrosoft SQL ServerまたはSybase Adaptive ServerのIF文の比較

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

例1:

CREATE PROC proc1 @Flag int = 0
AS
BEGIN
DECLARE @x int
IF ( @Flag=0 )
SELECT @x = -1
ELSE
SELECT @x = 10
END

例1:

CREATE OR REPLACE PROCEDURE proc1
(
v_Flag IN NUMBER DEFAULT 0
)
AS
v_x NUMBER(10,0);
BEGIN
IF ( v_Flag = 0 ) THEN
v_x := -1;
ELSE
v_x := 10;
END IF

例2:

CREATE PROC proc1 @Flag char(2) = ''
AS
BEGIN
DECLARE @x int
IF ( @Flag='' )
SELECT @x = -1
ELSE IF (@Flag = 'a')
SELECT @x = 10
ELSE IF (@Flag = 'b')
SELECT @x = 20
END

例2:

CREATE OR REPLACE PROCEDURE proc1
(
v_Flag IN CHAR DEFAULT ''
)
AS
v_x NUMBER(10,0);
BEGIN
IF ( v_Flag = '' ) THEN
v_x := -1;
ELSE
IF ( v_Flag = 'a' ) THEN
v_x := 10;
ELSE
IF ( v_Flag = 'b' ) THEN
v_x := 20;
END IF;
END IF;
END IF;
END;

例3:

CREATE PROC proc1
AS
BEGIN
DECLARE @x int
IF EXISTS ( SELECT * FROM table2 )
SELECT @x = -1
END

例3:

CREATE OR REPLACE PROCEDURE proc1
AS
v_x NUMBER(10,0);
v_temp NUMBER(1, 0) := 0;
BEGIN
SELECT 1 INTO v_temp
FROM DUAL
WHERE EXISTS ( SELECT *
FROM table2  );

IF v_temp = 1 THEN
v_x := -1;
END IF;
END;

例4:

CREATE PROC proc1 @basesal money, @empid int
AS
BEGIN
IF (select sal from emp where   empid = @empid) < @basesal
UPDATE emp
SET sal_flag = -1
WHERE empid = @empid
END

例4:

CREATE OR REPLACE PROCEDURE proc1
(
v_basesal IN NUMBER,
v_empid IN NUMBER
)
AS
v_temp NUMBER(1, 0) := 0;
BEGIN
SELECT 1 INTO v_temp
FROM DUAL
WHERE ( SELECT sal
FROM emp
WHERE empid = v_empid ) < v_basesal;

IF v_temp = 1 THEN
UPDATE emp
SET sal_flag = -1
WHERE empid = v_empid;
END IF;
END;

コメント

Microsoft SQL ServerまたはSybase Adaptive ServerとOracleのIF文は、次の2つの場合を除いてほぼ同じです。

- Microsoft SQL ServerまたはSybase Adaptive ServerのIf EXISTS(...)には、同等のPL/SQL構文がありません。そのため、表3-19の例3に示すSELECT INTO WHERE EXISTS句とIF文に変換されます。

- 比較対象を指定したIF (SELECT... )には、同等のPL/SQL構文がありません。そのため、表3-19の例4に示すSELECT INTO...WHERE...句に変換されます。

3.5.5 RETURN文

表3-20 OracleとMicrosoft SQL ServerまたはSybase Adaptive ServerのRETURN文の比較

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

CREATE PROC proc1
@x int
AS
IF @x = -1
RETURN 25022
ELSE
RETURN 25011

CREATE OR REPLACE FUNCTION proc1
(
v_x IN NUMBER
)
AS
BEGIN
IF v_x = -1 THEN
RETURN 25022;
ELSE
RETURN 25011;
END IF;
END;

コメント

RETURN文は、コール元のプログラムに単一の値を戻すために使用され、両方のデータベースで同様に動作します。Microsoft SQL ServerまたはSybase Adaptive Serverでは数値データ型のみを戻すことができ、Oracleではサーバー・データ型またはPL/SQLデータ型のいずれかを戻すことができます。

PL/SQLプロシージャでは、RETURN文によって、データを戻さずにコール元のプログラムに制御のみを戻すことができます。SQL Developerは、値を戻すプロシージャを自動的にファンクションに変換します。

3.5.6 RAISERROR文

表3-21 OracleとMicrosoft SQL ServerまたはSybase Adaptive ServerのRAISERROR文の比較

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

CREATE PROC proc1
AS
RAISERROR 12345 "No Employees found"

CREATE OR REPLACE PROCEDURE PROC1
AS
BEGIN
raise_application_error(-20999, 'No Employees found');
END PROC1;

コメント

Microsoft SQL ServerまたはSybase Adaptive Serverでは、RAISERRORを使用して、エラーが発生したことをクライアント・プログラムに通知します。この文はプロシージャの実行を終了しないため、次の文に制御が渡されます。

PL/SQLでは、RAISE_APPLICATION_ERROR文で同様の機能が提供されます。ただし、この文は、ストアド・サブプログラムの実行を終了し、コール元のプログラムに制御を戻します。RAISERROR文とRETURN文を組み合せた場合と同様に動作します。

3.5.7 EXECUTE文

表3-22 OracleとMicrosoft SQL ServerまたはSybase Adaptive ServerのEXECUTE文の比較

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

CREATE PROC proc1
AS
EXEC SetExistFlag
EXEC SetExistFlag yes=@yes, @Status OUT
EXEC @Status = RecordExists
EXEC SetExistFlag @yes

CREATE OR REPLACE PROCEDURE proc1
AS
BEGIN
SetExistFlag;
SetExistFlag(yes=>v_yes,Status);
Status:=RecordExists;
SetExistFlag(v_yes);
END proc1;

コメント

EXECUTE文は、プロシージャ内から別のストアド・プロシージャを実行するために使用されます。PL/SQLでは、プロシージャは、PL/SQLブロック内からその名前でコールされます。

SQL Developerは、パラメータをコールする場合の表記法を位置表記法、名前表記法または混合表記法に変換します。パラメータをコールする場合の表記法については、「スキーマ・オブジェクト」を参照してください。

3.5.8 WHILE文

表3-23 OracleとMicrosoft SQL ServerまたはSybase Adaptive ServerのWHILE文の比較

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

例1:

CREATE PROC proc1
@i int
AS
WHILE @i > 0

BEGIN
print 'Looping inside WHILE....'
SELECT @i = @i + 1
END

例1:

CREATE OR REPLACE PROCEDURE proc1
(
iv_i IN NUMBER
)
AS
v_i NUMBER(10,0) :=iv_i;
BEGIN
WHILE v_i > 0
LOOP
BEGIN
DBMS_OUTPUT.PUT_LINE('Looping inside WHILE....');
v_i := v_i + 1;
END;
END LOOP;
END;

例2:

CREATE PROC proc1
@i int,
@y int
AS
WHILE @i > 0
BEGIN
print 'Looping inside WHILE....'
SELECT @i = @i + 1
END

例2:

CREATE OR REPLACE PROCEDURE proc1
(
iv_i IN NUMBER,
v_y IN NUMBER
)
AS
v_i NUMBER(10,0):=iv_i;
BEGIN
WHILE v_i > 0
LOOP
BEGIN
DBMS_OUTPUT.PUT_LINE('Looping inside WHILE....');
v_i := v_i + 1;
END;
END LOOP;
END;

例3:

CREATE PROC proc1
AS
DECLARE @sal money
SELECT @sal = 0
WHILE EXISTS(SELECT * FROM emp where sal < @sal )
BEGIN
SELECT @sal = @sal + 99

DELETE emp
WHERE sal < @sal
END
GO

例3:

CREATE OR REPLACE PROCEDURE proc1
AS
v_sal NUMBER(19,2);
v_temp NUMBER(1, 0) := 0;
BEGIN
v_sal := 0;
LOOP
v_temp := 0;
SELECT 1 INTO v_temp
FROM DUAL
WHERE EXISTS ( SELECT *
FROM emp
WHERE sal < v_sal );
IF v_temp != 1 THEN
EXIT;
END IF;
BEGIN
v_sal := v_sal + 99;
DELETE emp
WHERE sal < v_sal;
END;
END LOOP;
END;

例4:

CREATE PROC proc1
AS

DECLARE @sal money

WHILE (SELECT count (*) FROM emp ) > 0
BEGIN
SELECT @sal = max(sal) from emp
WHERE stat = 1

DELETE emp
WHERE sal < @sal
END
GO

例4:

CREATE OR REPLACE PROCEDURE proc1
AS
v_sal NUMBER(19,2);
v_temp NUMBER(1, 0) := 0;
BEGIN
LOOP
v_temp := 0;
SELECT 1 INTO v_temp
FROM DUAL
WHERE ( SELECT COUNT(*)
FROM emp  ) > 0;
IF v_temp != 1 THEN
EXIT;
END IF;
BEGIN
SELECT MAX(sal)
INTO v_sal
FROM emp
WHERE stat = 1;
DELETE emp
WHERE sal < v_sal;
END;
END LOOP;
END;

コメント

SQL Developerを使用して、ほぼすべてのWHILE構文を変換できます。ただし、Microsoft SQL ServerまたはSybase Adaptive ServerのWHILEループ内のCONTINUEには、PL/SQLに同等の構文はありません。ラベルを指定したGOTO文を使用してシミュレートされます。

3.5.9 GOTO文

表3-24 OracleとMicrosoft SQL ServerまたはSybase Adaptive ServerのGOTO文の比較

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

CREATE PROC proc1 @Status int
AS
DECLARE @j int
IF @Status = -1
GOTO Error

SELECT @j = -1
Error:
SELECT @j = -99

CREATE OR REPLACE PROCEDURE proc1
(
v_Status IN NUMBER
)
AS
v_j NUMBER(10,0);
BEGIN
IF v_Status = -1 THEN
GOTO Error;
END IF;
v_j := -1;
<<Error>>
v_j := -99;
END;

コメント

GOTO <label>文は自動的に変換されます。手動で変更する必要はありません。

3.5.10 @@Rowcountおよび@@Error変数

表3-25 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverでの@@Rowcountおよび@@Error変数の比較

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

CREATE PROC proc1
AS
DECLARE @x int
SELECT @x=count(*) FROM emp
IF @@rowcount = 0
print 'No rows found.'
IF @@error = 0
print 'No errors.'

CREATE OR REPLACE PROCEDURE proc1
AS
v_sys_error NUMBER := 0;
v_x NUMBER(10,0);
BEGIN
BEGIN
SELECT COUNT(*)
INTO v_x
FROM emp ;
EXCEPTION
WHEN OTHERS THEN
v_sys_error := SQLCODE;
END;
IF SQL%ROWCOUNT = 0 THEN
DBMS_OUTPUT.PUT_LINE('No rows found.');
END IF;
IF v_sys_error = 0 THEN
DBMS_OUTPUT.PUT_LINE('No errors.');
END IF;
END;

コメント

@@rowcountは、PL/SQLのカーソル属性SQL%ROWCOUNTに変換されます。

@@errorは、v_sys_errorに変換されます。この変数には、SQLCODEファンクションによって戻された値が含まれます。SQLCODEによって戻された値は、例外ブロック内でのみ割り当てる必要があります。そうでない場合は、値0が戻されます。

3.5.11 ASSIGNMENT文

表3-26 OracleとMicrosoft SQL ServerまたはSybase Adaptive ServerのASSIGNMENT文の比較

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

CREATE PROC proc1
AS
DECLARE @x int
SELECT @x = -1
SELECT @x=sum(salary) FROM employee

CREATE OR REPLACE PROCEDURE proc1
AS
v_x NUMBER(10,0);
BEGIN
v_x := -1;
SELECT SUM(salary)
INTO v_x
FROM employee ;
END;

コメント

Microsoft SQL ServerまたはSybase Adaptive Serverでの割当ては、SELECT文を使用して行います(表3-26を参照)。

PL/SQLでは、次の方法で値を変数に割り当てます。

割当て文を使用して、変数または式の値をローカル変数に割り当てます。SELECT..INTO句を使用して、データベースから値を割り当てます。これを行うには、SQLによって1行のみが戻される必要があります。

3.5.12 SELECT文

表3-27 OracleとMicrosoft SQL ServerまたはSybase Adaptive ServerのSELECT文の比較

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

例1

CREATE PROC proc1
AS
SELECT ename FROM employee

例1

CREATE OR REPLACE PROCEDURE proc1
(
cv_1 IN OUT SYS_REFCURSOR
)
AS
BEGIN
OPEN cv_1 FOR
SELECT ename
FROM employee ;
END;

例2

CREATE PROC proc1
AS
DECLARE @name char(20)
SELECT @id = id
FROM employee

RETURN id

例2

CREATE OR REPLACE FUNCTION proc1
AS
v_name CHAR(20);
BEGIN
SELECT id
INTO v_id
FROM employee ;
RETURN v_id;
END;

コメント

それぞれのアーキテクチャの違いのため、Microsoft SQL ServerまたはSybase Adaptive Serverのストアド・プロシージャは、Oracleとは異なる方法でクライアント・プログラムにデータを戻します。

Microsoft SQL ServerまたはSybase Adaptive ServerとOracleでは、ストアド・プロシージャの出力パラメータを使用して、すべてのデータをクライアントに渡すことができます。

3.5.13 GROUP BY句が指定されたSELECT文

表3-28 OracleとMicrosoft SQL ServerまたはSybase Adaptive ServerでのGROUP BY句が指定されたSELECT文の比較

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

CREATE PROC proc1
AS
DECLARE @ename char(20)
DECLARE @salary int
SELECT @ename=ename, @salary=salary FROM emp
WHERE salary > 100000
GROUP BY deptno

CREATE OR REPLACE PROCEDURE proc1
AS
v_ename CHAR(20);
v_salary NUMBER(10,0);
BEGIN
SELECT ename,
salary
INTO v_ename,
v_salary
FROM emp
WHERE salary > 100000
GROUP BY deptno;
END;

コメント

T-SQLでは、GROUP BY句で使用される列をSELECT構文のリストの一部にする必要がないGROUP BY文を使用できます。PL/SQLでは、このタイプのGROUP BY句は使用できません。

SQL Developerは、このタイプのSELECT文をPL/SQLに変換します。ただし、Oracleで同様に動作するPL/SQL文はエラーを戻します。

3.5.14 列別名

表3-29 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverでの列別名の比較

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

CREATE PROC proc1
@Status int=0
AS
SELECT x=sum(salary) FROM employee

CREATE OR REPLACE PROCEDURE proc1
(
v_Status IN NUMBER DEFAULT 0,
cv_1 IN OUT SYS_REFCURSOR
)
AS
BEGIN
OPEN cv_1 FOR
SELECT SUM(salary) x
FROM employee ;
END;

コメント

SQL Developerを使用して、Microsoft SQL ServerまたはSybase Adaptive Server固有の列別名をOracle形式の列別名に変換できます。手動で変更する必要はありません。

3.5.15 FROMが指定されたUPDATE文

表3-30 OracleとMicrosoft SQL ServerまたはSybase Adaptive ServerのFROMが指定されたUPDATE文の比較

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

CREATE PROC proc1
AS
UPDATE table1
SET col1 = 1
FROM table1, table2
WHERE table1.id = table2.id

CREATE OR REPLACE PROCEDURE proc1
AS
BEGIN
UPDATE table1
SET ( col1 ) = ( SELECT 1
FROM table1 ,
table2
WHERE table1.id = table2.id );
END;

3.5.16 FROMが指定されたDELETE文

表3-31 OracleとMicrosoft SQL ServerまたはSybase Adaptive ServerのFROMが指定されたDELETE文の比較

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

CREATE PROC proc1
AS
DELETE FROM table1
FROM table1, table2
WHERE table1.id = table2.id

CREATE OR REPLACE PROCEDURE proc1
AS
BEGIN
DELETE FROM table1
WHERE ROWID IN
(SELECT table1.ROWID
FROM table1, table2
WHERE table1.id = table2.id);
END;

3.5.17 一時表

表3-32 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverの一時表の比較

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

CREATE PROC proc1
AS
SELECT col1, col2
INTO #Tab
FROM table1
WHERE table1.id = 100

CREATE OR REPLACE PROCEDURE proc1
AS
BEGIN
DELETE FROM tt_Tab;

INSERT INTO tt_Tab (
SELECT col1,
col2
FROM table1
WHERE table1.id = 100 );
END;

コメント

一時表はOracleでサポートされています。SQL Developerでは、この機能を使用します。一時表のDDLが抽出され、スタンドアロン・オブジェクトとして生成されます。

3.5.18 カーソル処理

表3-33 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverでのカーソル処理の結果セットの比較

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

CREATE PROC cursor_demo
AS
DECLARE @empno   INT
DECLARE @ename   CHAR(100)
DECLARE @sal     FLOAT
DECLARE cursor_1 CURSOR
FOR SELECT empno, ename, sal FROM emp

OPEN cursor_1

FETCH cursor_1 INTO @empno, @ename, @sal

CLOSE cursor_1

DEALLOCATE CURSOR cursor_1

CREATE OR REPLACE PROCEDURE cursor_demo
AS
CURSOR cursor_1
IS SELECT empno,
ename,
sal
FROM emp ;
v_empno NUMBER(10,0);
v_ename CHAR(100);
v_sal NUMBER;
BEGIN
OPEN cursor_1;
FETCH cursor_1 INTO v_empno,v_ename,v_sal;
CLOSE cursor_1;
END;

コメント

Microsoft SQL ServerおよびSybase Adaptive Serverでは、T-SQLにカーソルが導入されました。Microsoft SQL ServerまたはSybase Adaptive ServerからOracleへのカーソルの構文変換は簡単に行うことができます。

注意:
PL/SQLでは、カーソルの割当て解除は自動的に行われるため、実行する必要はありません。

3.6 T-SQLとPL/SQLの言語要素

T-SQLはMicrosoft SQL ServerまたはSybase Adaptive Serverの手続き型SQL言語で、PL/SQLはOracleの手続き型SQL言語です。この項では、次のT-SQLとPL/SQLの言語要素について説明します。

- トランザクション処理方法

- 例外処理方法およびエラー処理方法

- 特別なグローバル変数

- 演算子

- 組込みファンクション

- Microsoft SQL ServerまたはSybase Adaptive Serverストアド・プロシージャ内のDDL構文

3.6.1 トランザクション処理方法

Microsoft SQL ServerまたはSybase Adaptive Server

Microsoft SQL ServerまたはSybase Adaptive Serverでは、ANSI規格の暗黙的トランザクション・モデルおよび明示的トランザクション・モデルという2つの異なるトランザクション・モデルが提供されています。

Microsoft SQL ServerまたはSybase Adaptive Serverでは、ANSI規格のトランザクションをサポートするオプションが提供されています。これらのオプションは、SETコマンドを使用して設定または設定解除できます。

次のSETコマンドを実行すると、暗黙的トランザクション・モデルが設定されます。

set chained on

次のSETコマンドを実行すると、分離レベルが必要なレベルに設定されます。

set transaction isolation level {1|3}

isolation level 1を指定すると、内容を保証しない読取りが行われなくなります。isolation level 2を指定すると、反復不能な読取りが行われなくなります。isolation level 3を指定すると、仮読取りが行われなくなります。ANSI規格では、isolation level 3を指定する必要があります。Microsoft SQL ServerまたはSybase Adaptive Serverの場合、デフォルトはisolation level 1です。

Microsoft SQL ServerまたはSybase Adaptive Serverでは、isolation level 3を実装するために、トランザクションに関連するすべての表にHOLDLOCKが適用されます。Microsoft SQL ServerまたはSybase Adaptive Serverでは、ページ・レベル・ロックとともに、HOLDLOCKを使用してユーザーを長時間ブロックできます。これを行うとレスポンス時間が長くなります。

Microsoft SQL ServerまたはSybase Adaptive Serverのアプリケーションで、isolation level 3が指定されたANSI規格の連鎖(暗黙的)トランザクションを実装すると、Oracleでは(リピータブル・リードが保証される)ANSI規格の暗黙的トランザクション・モデルが実装されるため、このアプリケーションの移行が正常に行われます。

非ANSI規格のアプリケーションでは、Microsoft SQL ServerまたはSybase Adaptive Serverのトランザクションは明示的です。論理トランザクションは、BEGIN TRANSACTION文を使用して明示的に開始する必要があります。トランザクションは、COMMIT TRANSACTION文を使用してコミットするか、またはROLLBACK TRANSACTION文を使用してロールバックします。トランザクションには、名前を付けることができます。たとえば、次の文は、名前を付けてトランザクションを開始します。

account_tran.
BEGIN TRANSACTION account_tran

明示的トランザクション・モードでは、ネストしたトランザクションを使用できます。ただし、可能なのは構文上のネストです。トランザクションは、一番外側のBEGIN TRANSACTIONおよびCOMMIT TRANSACTION文によってのみ実際に作成およびコミットされます。内側のCOMMIT TRANSACTIONは実際にはコミットされないため、この構文はわかりにくい場合があります。

次に、ネストしたトランザクションの例を示します。

BEGIN TRANSACTION
/* T/SQL  Statements */
BEGIN TRANSACTION
/* T/SQL  Statements */
BEGIN TRANSACTION account_tran
/* T/SQL  Statements */
IF SUCCESS
COMMIT TRANSACTION account_tran
ELSE
ROLLBACK TRANSACTION account_tran
END IF
/* T/SQL  Statements */
IF SUCCESS
COMMIT TRANSACTION
ELSE
ROLLBACK TRANSACTION
END IF
/* T/SQL  Statements */
COMMIT TRANSACTION

BEGIN TRANSACTIONおよびCOMMIT TRANSACTION文がネストされている場合は、一番外側の組によってトランザクションが作成およびコミットされ、内側の組ではネスト・レベルが追跡されるのみです。トランザクションは、一番外側のCOMMIT TRANSACTION文が実行されるまでコミットされません。通常、トランザクションのネストは、BEGIN TRANSACTION/COMMIT TRANSACTION文を含むストアド・プロシージャを使用して、トランザクション処理文を含む他のプロシージャをコールすると発生します。グローバル変数@@trancountは、現行のユーザーに対して現在アクティブなトランザクションの数を追跡します。複数のトランザクションをオープンしている場合は、ROLLBACKを実行後、COMMITを実行する必要があります。

内側のCOMMIT TRANSACTION文は、名前の有無にかかわらず実行されません。名前が付いていない内側のROLLBACK TRANSACTION文は、一番外側のBEGIN TRANSACTION文にロールバックされ、現行のトランザクションを取り消します。名前が付いている内側のROLLBACK TRANSACTION文は、名前が付いている各トランザクションを取り消します。

Oracle

Oracleでは、ANSI規格の暗黙的トランザクション方法を使用できます。論理トランザクションは、COMMIT、ROLLBACKまたはデータベースへの接続を行った後の最初の実行SQL文で開始されます。トランザクションは、COMMIT、ROLLBACKまたはデータベースからの切断を行うと終了します。暗黙的COMMIT文は、各DDL文の実行前および実行後に発行されます。有効にできる論理トランザクションは1セッション当たり1つのみのため、暗黙的トランザクション・モデルを使用すると、手動でトランザクションをネストする必要がなくなります。ユーザーは、トランザクションにSAVEPOINTを設定し、一部のトランザクションをSAVEPOINTにロールバックできます。

次に例を示します。

UPDATE test_table SET col1='value_1';
SAVEPOINT first_sp;
UPDATE test_table SET col1='value_2';
ROLLBACK TO SAVEPOINT first_sp;
COMMIT;   /* col1 is 'value_1'*/

3.6.1.1 変換準備に関する推奨事項

論理トランザクションは、Microsoft SQL ServerまたはSybase Adaptive ServerとOracleでは異なる方法で処理されます。Microsoft SQL ServerまたはSybase Adaptive Serverでは、トランザクションはデフォルトで明示的です。Oracleでは、ANSI規格の暗黙的トランザクション方法が実装されます。これによって、T-SQLトランザクション処理文からPL/SQLトランザクション処理文に直接変換する必要がなくなります。

また、Microsoft SQL ServerまたはSybase Adaptive Serverでは、ストアド・プロシージャのトランザクションでネスト可能である必要がありますが、Oracleでは、トランザクションのネストはサポートされていません。

表3-34では、Microsoft SQL ServerまたはSybase Adaptive ServerとOracleのトランザクション処理文を比較します。

表3-34 OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverのトランザクション処理文の比較

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

BEGIN TRAN

BEGIN TRAN tran_1

SAVEPOINT tran_1

COMMIT TRAN

(ネスト・レベル=1が指定されたトランザクション用)

COMMIT

COMMIT TRAN

(ネスト・レベル>1が指定されたトランザクション用)

COMMIT TRAN tran_1

(ネスト・レベル=1が指定されたトランザクション用)

COMMIT

COMMIT TRAN tran_1

(ネスト・レベル>1が指定されたトランザクション用)

ROLLBACK TRAN

ROLLBACK

ROLLBACK TRAN tran_1

ROLLBACK TO SAVEPOINT tran_1

変換時、SQL Developerでは、現行のトランザクション処理文のネスト・レベルは判断できません。変数@@trancountはランタイム環境変数です。

表3-35に、Oracleでのトランザクション処理文の変換方法に対して現在実装されているMicrosoft SQL ServerまたはSybase Adaptive Serverを示します。

表3-35 トランザクション処理文の変換方法

Microsoft SQL ServerまたはSybase Adaptive Server

Oracle

BEGIN TRAN

/*BEGIN TRAN  >>> statement ignored <<<*/

BEGIN TRAN tran_1

SAVEPOINT tran_1;

COMMIT TRAN

(ネスト・レベル=1が指定されたトランザクション用)

COMMIT WORK;

COMMIT TRAN

(ネスト・レベル>1が指定されたトランザクション用)

COMMIT WORK;

COMMIT TRAN tran_1

(ネスト・レベル=1が指定されたトランザクション用)

COMMIT WORK;

COMMIT TRAN tran_1

(ネスト・レベル>1が指定されたトランザクション用)

COMMIT WORK;

ROLLBACK TRAN

ROLLBACK WORK;

ROLLBACK TRAN tran_1

ROLLBACK TO SAVEPOINT tran_1

SAVE TRAN tran_1

SAVEPOINT tran_1

2つのデータベースでトランザクションを処理する方法に違いがあるため、トランザクションの再編成を検討する必要がある場合があります。

トランザクション処理文がストアド・プロシージャのコードではなくクライアントのコードの一部となるように、クライアント/サーバー・アプリケーションを設計します。通常、論理トランザクションはユーザーが設計および制御する必要があるため、このように設計すると効果的です。

ストアド・プロシージャの変換の場合は、SAVEPOINTをプロシージャの先頭に設定し、SAVEPOINTにのみロールバックすることを検討してください。Microsoft SQL ServerまたはSybase Adaptive Serverでは、少なくとも外側のトランザクションがクライアント・アプリケーションで制御されるように変更します。

3.6.2 例外処理方法およびエラー処理方法

Microsoft SQL ServerまたはSybase Adaptive Server

Microsoft SQL ServerまたはSybase Adaptive Serverでは、前の文によって生成されたエラー状態に関係なく、制御が次の文に渡されるため、各SQL文の実行後にエラーを確認する必要があります。クライアントのERROR_HANDLERルーチンは、サーバー・エラーが発生した場合、コールバック・ルーチンとして起動されます。エラー状態はこのコールバック・ルーチンで処理できます。

ストアド・プロシージャは、RAISERROR文を使用してエラー状態をクライアントに通知します。この文を使用しても、制御はコール元のルーチンに戻されません。

Microsoft SQL ServerまたはSybase Adaptive Serverでは、システム表を使用してエラー・メッセージをカスタマイズできます。システム・プロシージャを使用して、エラー・メッセージをこの表に追加できます。

Oracle

Oracleでは、次の文に進む前に、各SQL文でエラーが自動的に確認されます。エラーが発生すると、すぐに制御が例外ハンドラ(存在する場合)に渡されます。これによって、すべてのSQL文の状態を確認する必要がなくなります。たとえば、SELECT文でデータベース内の行が検出されない場合は、例外が発生します。ブロックの対応する例外ハンドラ部分には、このエラーを処理するコードが含まれている必要があります。RAISE_APPLICATION_ERROR組込みプロシージャは、サーバー・エラー状態をクライアントに通知し、コール元のルーチンにすぐに戻します。

Oracleでは、暗黙的SAVEPOINTがプロシージャの先頭に指定されます。RAISE_APPLICATION_ERROR組込みプロシージャによって、このSAVEPOINT、またはプロシージャ内の最後にコミットされたトランザクションにロールバックされます。制御は、コール元のルーチンに戻されます。

OracleのRAISE_APPLICATION_ERROR文によって、ユーザーはエラー・メッセージをカスタマイズできます。例外が発生した場合は、PL/SQLによって、SQLCODEがコール元に自動的に戻されます。処理されるまで継続して伝播します。

推奨事項:

OracleでMicrosoft SQL ServerまたはSybase Adaptive Serverの動作をシミュレートするには、各SQL文を、同様に動作するPL/SQLブロックで囲む必要があります。このブロックで、SQL文用に検出する必要がある例外を処理する必要があります。

Microsoft SQL ServerまたはSybase Adaptive Serverの動作のシミュレートに必要な特別なコードの詳細は、「T-SQLとPL/SQLの構文」を参照してください。

Microsoft SQL ServerまたはSybase Adaptive Serverのストアド・プロシージャのRAISERROR文の直後にRETURN文を指定すると、これらの2つの文をOracleのRAISE_APPLICATION_ERROR文に変換できます。

ユーザー定義の表を使用してエラー・メッセージをカスタマイズできます。標準ルーチンを作成し、この表にエラー・メッセージを取得できます。この方法には、2つの目的があります。システムの移植性を高めること、および管理者がエラー・メッセージを集中制御できるようにすることです。

3.6.3 特別なグローバル変数

Microsoft SQL ServerまたはSybase Adaptive Server

Microsoft SQL ServerまたはSybase Adaptive Serveでは、次のグローバル変数は、変換処理で特に有効です。

@@error:

最後に実行したT-SQL文の実行状態を示すサーバー・エラー・コードです。コード例については、「@@Rowcountおよび@@Error変数」を参照してください。

@@identity:

文によって最後に生成された識別値を戻します。ROLLBACKSまたは他のトランザクションのため、前の設定には戻りません。

@@rowcount:

最後に実行したT-SQL文によって影響を受ける行の数です。コード例については、「@@Rowcountおよび@@Error変数」を参照してください。

@@servername:

Microsoft SQL ServerまたはSybase Adaptive Serverのローカル・サーバーの名前です。

@@sqlstatus:

最後のFETCH文の状態情報です。

@@tranchained:

T-SQLプロシージャの現行のトランザクション・モードです。@@tranchainedによって1が戻される場合、TL/SQLプロシージャは連鎖状態か、暗黙的トランザクション・モードです。

@@trancount:

現行のユーザーのネストしたトランザクションのネスト・レベルを追跡します。

@@transtate:

トランザクションの現行の状態です。

Oracle

SQLCODE:

最後に実行したPL/SQL文の実行状態を示すサーバー・エラー・コードです。

SQL%ROWCOUNT:

PL/SQLプロシージャ内から実行した各SQL文に対応付けられた暗黙カーソルに追加された変数です。この変数には、暗黙カーソルに追加されたSQL文を実行すると影響を受ける行の数が含まれます。

推奨事項:

Oracleには、@@error変数と完全に同等の機能(SQLCODEファンクション)があります。SQLCODEファンクションは、サーバー・エラー・コードを戻します。

OracleのSQL%ROWCOUNT変数は、機能的に@@rowcountと同等です。

PL/SQLでは、さらに多くの特別なグローバル変数を使用できます。ここでは、一部のグローバル変数のみについて説明します。T-SQLでも、さらに多くの特別なグローバル変数を使用できます。ここでは、変換処理で重要な役割を果たす一部のグローバル変数についてのみ説明します。

3.6.4 演算子

Microsoft SQL ServerまたはSybase Adaptive ServerとOracleの演算子については、「データ操作言語」を参照してください。

3.6.5 組込みファンクション

Microsoft SQL ServerまたはSybase Adaptive ServerとOracleの組込みファンクションについては、「データ操作言語」を参照してください。

3.6.6 Microsoft SQL ServerまたはSybase Adaptive Serverストアド・プロシージャ内のDDL構文

Microsoft SQL ServerまたはSybase Adaptive Serverでは、DDL構文をストアド・プロシージャの一部にできます。Oracleでは、DDL文を動的SQLの一部にできます。また、各DDL文の実行後にCOMMIT文が発行されます。

現在、SQL Developerは、ストアド・プロシージャ内のDDL構文をスタンドアロンのDDL構文に変換します。DDLは、ストアド・プロシージャの本体から削除され、プロシージャより前に作成されます。動的SQLのサポートは、将来のリリースで提供される予定です。

4 分散環境

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

- 4.1 「分散環境」

- 4.2 「アプリケーション開発ツール」

4.1 分散環境

分散環境は、次のように様々なアプリケーションで使用されます。

- 地理的に様々な場所でデータが生成され、ほとんどの時間、そのデータがローカルで使用可能である必要があるアプリケーション。

- 特定のサイトまたはハードウェア障害による影響を低減するために、データおよびソフトウェアの処理が分散されるアプリケーション。

4.1.1 分散環境でのリモート・データベース・アクセス

リレーショナル・データベース管理システム(RDBMS)によって、ユーザーには単一の論理的なデータ表示を提供しながら、データを分散できる場合、位置の透過性がサポートされます。位置の透過性によって、データの実際の物理的な位置を知る必要がなくなります。このため、アプリケーション開発が容易になります。データベース管理者(DBA)は、アプリケーションの必要性に応じて、関連データの位置を隠すことができます。

リモート・オブジェクトにアクセスするには、ローカル・サーバーが、そのリモート・サーバーとの接続を確立する必要があります。各サーバーには、そのリモート・サーバーに対して一意の名前が必要です。リモート・サーバーとの接続を確立するために使用されるメソッド、およびリモート・オブジェクトのネーミング規則は、データベースによって異なります。

4.1.1.1 Oracleおよびリモート・オブジェクト

Oracleでは、グローバル・オブジェクト名を使用することによって、分散データベース全体のリモート・オブジェクト(表、ビュー、プロシージャなど)をSQL文で参照できます。Oracleでのグローバル・スキーマ・オブジェクト名には、オブジェクトを含むスキーマ名、次にオブジェクト名、アットマーク(@)が続き、その後にデータベース名を付けます。たとえば、次の問合せは、リモート・サーバーに格納されているSALESデータベースのscott.empという名前の表から情報を選択します。

SELECT * FROM
scott.emp@sales.division3.acme.com

分散データベース・システムは、システム内の各データベースが一意のデータベース名を持つように構成でき、それによって効果的なグローバル・オブジェクト名を提供されます。

さらに、リモート・オブジェクト名に対してシノニムを定義することによって、リモート・データベースの名前を参照する必要性がなくなります。シノニムは、リモート・データベース・オブジェクトを参照する、ローカル・データベース内のオブジェクトです。シノニムによって、アプリケーション開発者ではなくDBAの責任でデータを分散することができます。DBAは、シノニムを使用することによって、アプリケーションに影響を与えることなく必要なときにオブジェクトを移動できます。

シノニムは、次のようにして定義できます。

CREATE PUBLIC SYNONYM emp FOR
scott.emp@sales.division3.acme.com;

このシノニムを使用することにより、前述のSQL文を次のように変更できます。

SELECT * FROM emp;

4.1.2 Microsoft SQL ServerまたはSybase Adaptive Serverとリモート・オブジェクト

Microsoft SQL ServerまたはSybase Adaptive Serverでは、分散データベース内のスキーマ・オブジェクトが、完全修飾されたオブジェクト名によってSQL文内で参照される必要があります。スキーマ・オブジェクト名は次のとおりです。

server_name.database_name.object_owner_name.object_name

server_nameは、リモート・サーバーの名前です。database_nameは、リモート・サーバー上のリモート・データベースの名前です。

Microsoft SQL ServerまたはSybase Adaptive Serverは、シノニムの概念や位置の透過性をサポートしていません。分散環境では、開発者がオブジェクトの位置をアプリケーション・コードに含める必要があるため、オブジェクトを移動するとアプリケーションに影響します。

ほぼすべての静的問合せには、リモート・サーバーおよびリモート・データベースへの参照を含める傾向があります。一部のアプリケーションではユーザー表を保持して、完全なオブジェクト名(リモート・サーバー名およびデータベース名を含む)をダミーのオブジェクト名にマップします。問合せは、このようなダミーのオブジェクト名を参照します。変換は、ユーザー表でのマップを使用して、リアルタイムで実行されます。この制限によって、OracleとMicrosoft SQL ServerまたはSybase Adaptive Serverで動作できるリモート・オブジェクトへのすべての一般的な参照方法が使用できなくなります。

Microsoft SQL ServerのOmni SQL Gatewayサーバーでは、位置の透過性がサポートされていますが、これには、分散環境に関連するすべてのデータベースのスキーマ定義がOmni SQL Gatewayサーバーで使用可能である必要があります。

4.1.3 レプリケーション

Microsoft SQL ServerまたはSybase Adaptive Serverのレプリケーション機能には、次の特性があります。

- 一方向

- トランザクション・ベースではなく表ベース

- 自動競合解消がない(手動で解消する必要がある)

- Open Database Connectivity(ODBC)を介した異機種間のレプリケーション

前述した特性に加えて、Microsoft SQL Server 7.0のレプリケーションは、ODBCによる異機種間レプリケーションを提供します。

Oracleレプリケーションには、次に示す豊富なレプリケーション機能があります。

- 双方向

- すべてのデータベース・オブジェクトがレプリケート可能

- 自動再同期化

- 自動競合解消

- ゲートウェイを介した異機種間レプリケーション

Oracle分散環境およびレプリケーションは、Microsoft SQL ServerまたはSybase Adaptive Serverのスーパーセットをサポートするため、分散アプリケーションを、Microsoft SQL ServerまたはSybase Adaptive ServerからOracleへ変換できます。

4.2 アプリケーション開発ツール

現在使用可能ないくつかのアプリケーション開発ツールは、いずれかのデータベース・サーバーの特定の機能を使用します。そのため、このような製品を別のデータベース・サーバーに移植することが、非常に困難な場合があります。クリティカルなアプリケーションでは、ODBCサポートは適していないため、基礎となるデータベースと最適に動作する別のアプリケーション開発ツールを開発してメンテナンスすることが最適である場合があります。

Microsoft SQL ServerまたはSybase Adaptive Serverアプリケーションの多くは、ODBCアプリケーション・プログラミング・インタフェース(API)またはVisual Basicで記述されています。DB-Libraryは、バックエンドにMicrosoft SQL ServerまたはSybase Adaptive Serverを使用する3GLアプリケーションの開発に広く使用されています。

Oracleでは、ODBCの接続性が提供されているため、Oracleバックエンドで動作するようにODBCベースのMicrosoft SQL ServerまたはSybase Adaptive Serverアプリケーションを変換できます。

Visual Basicアプリケーションが、Microsoft SQL ServerまたはSybase Adaptive Serverにアクセスする接続プロトコルとしてODBCを使用して記述されている場合は、そのVisual BasicアプリケーションがOracleバックエンドで動作するように変更できます。

多くのVisual Basicアプリケーションは、Visual Basic用のDB-LibraryであるVB-SQLを使用しています。VB-SQLによって、Visual BasicプログラムからMicrosoft SQL ServerまたはSybase Adaptive Serverへネイティブに(ODBCを使用しないで)アクセスできます。そのようなアプリケーションは、VB-SQLデータベース・アクセス・ルーチンを、Oracle Objects for OLEに変更すると、Oracleバックエンドで動作するように変換することもできます。

Oracleには、Oracle Call Interface(OCI)と呼ばれるコール・インタフェースが用意されています。これには、DB-Library APIと同等の機能があります。DB-LibraryアプリケーションからOCIアプリケーションへ変換できます。

5 非接続ソース・モデルのロード

SQL Developerの非接続ソース・モデルのロード機能を使用すると、顧客側でSQL Developerをインストールおよび起動することなく、コンサルタントが顧客のデータベースを移行できます。

非接続ソース・モデルのロード・オプションを実行するには、顧客は、移行するデータベースのスキーマ・メタデータを含むデリミタ付きフラット・ファイルを生成する必要があります。ソース・データベースに対して事前定義されたSQL Developerスクリプトを実行すると、フラット・ファイルが生成されます。フラット・ファイルは、SQL Developerを使用するコンサルタントに送信され、ソース・モデルおよびOracleモデルにメタデータ・ファイルがロードされます。これで、このスキーマをOracleにマップできます。

5.1 データベースのメタデータ・フラット・ファイルの生成

Microsoft SQL ServerまたはSybase Adaptive Serverデータベースは、一括コピー・プログラム(Bulk Copy Program: BCP)を使用して、デリミタ付きメタデータ・フラット・ファイルを生成します。SQL Developerでインストールされた事前定義済スクリプトがBCPを起動し、データベースごとにフラット・ファイルを生成します。BCPは、データベースから.dat拡張子付きのデリミタ付きメタデータ・ファイルを出力します。ただし、データベースを正常に移行するために、.datメタデータ・ファイルはSQL DeveloperによってXMLファイルに変換されます。移行の取得フェーズ中にソースのメタデータ・ファイルが選択された場合、SQL Developerは.datファイルを変換し、生成された.xmlファイルをソースの.datファイルと同一のrootディレクトリに出力します。

5.1.1 フラット・ファイルの生成スクリプト

事前定義されたスクリプト・ファイルは、%ORACLE_HOME%\Omwb\DSML_Scripts\pluginディレクトリに格納されています。次の表に、適切なSQL Developerスクリプトの格納場所を示します。

表5-1 スクリプト・ファイルの位置と名前および関連するファイルの名前

プラグイン

ディレクトリのパス

スクリプト・ファイルの名前

関連するファイル

Microsoft SQL Server 7

%ORACLE_HOME%\DSML_scripts\sqlserver7

SS7_DSML_SCRIPT.BAT

なし

Microsoft SQL Server 2000

%ORACLE_HOME%\DSML_scripts\sqlserver2000

SS2K_DSML_SCRIPT.BAT

なし

5.1.1.1 スクリプトの実行

%ORACLE_HOME%\DSML_scripts\<plugin>ディレクトリからプラグインのスクリプト・ファイルを実行するには、次のコマンドラインを使用します。

<script file name> <database> <password> <server>

たとえば、Microsoft SQL Server 2000スクリプト・ファイルを実行して、メタデータ・フラット・ファイルを生成するには、次のコマンドを使用します。

SS2K_DSML_SCRIPT <database> <password> <server>

索引
A  B  C  D  E  F  G  I  L  M  O  P  R  S  T  U  V  W

A

リモート・データベースへのアクセス, 4.1.1

AFTERトリガー, 3.1

アプリケーション開発ツール, 4.2

算術演算子, 2.4.7.2

ASSIGNMENT文, 3.5.11

B

BEGIN TRAN文, 3.2.2

BEGIN TRANSACTION文, 3.2.2

ビット演算子, 2.4.7.5

BLOB, 2.1.3.1.2

組込みファンクション, 2.4.8, 3.6.5

C

CHAR(n)データ型, 2.2.1

文字ファンクション, 2.4.8.1

チェック制約, 2.1.3.5

列別名, 3.5.14

列名, 2.1.2

列レベルのチェック制約, 2.1.3.5

COMMIT TRAN文, 3.2.2

COMMIT TRANSACTION文, 3.2.2

比較演算子, 2.4.7.1

データベースへの接続, 2.4.1

制御ファイル, 2.3.1

CREATE PROCEDURE文, 3.5.1

カーソル処理, 3.5.18

エラー・メッセージのカスタマイズ, 3.2.3.2

D

データ・ブロック, 2.3.1

データ同時実行性, 2.4.9

データファイル, 2.3.1

データ操作言語, 2.4

データ記憶域の概要, 2.3

データ型のマッピング, 2.2

データ型, 3.3

データ型, 変換時の考慮事項, 2.1.3.1

データベース・デバイス, 2.3.1

日付ファンクション, 2.4.8.3

DATETIMEデータ型, 2.1.3.1.1, 2.2.1

DDL構文, 3.6.6

宣言的な参照整合性, 2.1.3.3

DECLARE文, 3.5.3

DELETE文, 2.4.6

DELETEトリガー, 3.1

FROMを指定したDELETE文, 3.5.16

移行先データベース, 1.4

非接続ソース・モデルのロード, 5

分散環境, 4.1

E

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

エラー処理, 3.2.3

エラー処理方法, 3.6.2

例外処理方法, 3.6.2

EXECUTE文, 3.5.7

明示的トランザクション・モデル, 3.6.1

エクステント, 2.3.1

F

機能, 1.3

フラット・ファイルの生成スクリプト, 5.1.1

FLOATデータ型, 2.2.1

ファンクション, スキーマ・オブジェクト, 3.4.2

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

G

グローバル変数, 3.5.10, 3.6.3

GOTO文, 3.5.9

I

IF文, 3.5.4

IMAGEデータ型, 2.1.3.1.2

暗黙的トランザクション・モデル, 3.6.1

個々のSQL文, 3.2.1

INSERT文, 2.4.4

INSERTトリガー, 3.1

L

ロックの概要, 2.4.9

論理トランザクション, 3.2.2

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

M

算術ファンクション, 2.4.8.4

メタデータ・フラット・ファイル

生成, 5.1

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

O

オブジェクト名, 2.1.2

演算子, 2.4.7, 3.6.4

Oracleモデル, 1.4

P

パッケージ本体, 3.4.4

パッケージ, スキーマ・オブジェクト, 3.4.3

ページ, 2.3.1

ページ・レベル・ロック, 2.4.9.2

パラメータの受渡し, 3.5.2

PL/SQLとT-SQLの構文, 比較, 3.5

PL/SQLとT-SQL, 言語要素, 3.6

プロシージャ, スキーマ・オブジェクト, 3.4.1

製品説明, 1.2

R

RAISERROR文, 3.2.3.1, 3.5.6

読取り一貫性, 2.4.9.3

REDOログ・ファイル, 2.3.1

参照整合性, 3.1

参照整合性制約, 2.1.3.3

リモート・オブジェクト, Oracle, 4.1.1.1

リモート・オブジェクト, SQL ServerまたはSybase, 4.1.2

レプリケーション, 4.1.3

リポジトリ, 1.4

予約語, 2.1.2

RETURN文, 3.5.5

ROLLBACK TRAN文, 3.2.2

ROLLBACK TRANSACTION文, 3.2.2

行レベル・ロック, 2.4.9.2

S

スキーマの移行, 2.1

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

SELECT INTO文, 2.4.2.2

SELECT文, 2.4.2, 3.5.12

SELECT文, GROUP BY句, 3.5.13

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

GROUP BYを指定したSELECT文, 2.4.3

集合演算子, 2.4.7.4

ソース・データベース, 1.4

ソース・モデル, 1.4

特別なグローバル変数, 3.6.3

ストアド・プロシージャ, SQL ServerまたはSybase, 3.2

ストアド・サブプログラム, Oracle, 3.2

文字列演算子, 2.4.7.3

SYSNAMEデータ型, 2.2.1

T

表の設計上の考慮事項, 2.1.3

表レベルのチェック制約, 2.1.3.5

表領域, 2.3.1

一時表の比較, 3.5.17

TEXTデータ型, 2.1.3.1.2

TIMESTAMPデータ型, 2.2.1

トランザクション処理方法, 3.6.1

トリガー, Oracle, 3.2

トリガー, SQL ServerまたはSybase, 3.2

T-SQLとPL/SQLの構文, 比較, 3.5

T-SQLとPL/SQL, 言語要素, 3.6

T-SQLローカル変数, 3.3.1

U

一意キー, 2.1.3.4

UPDATE文, 2.4.5

UPDATEトリガー, 3.1

FROMを指定したUPDATE文, 3.5.15

ユーザー定義型, SQL ServerまたはSybase, 2.1.3.1.3

V

VARCHAR(n)データ型, 2.2.1

W

WHILE文, 3.5.8

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

コピーライトについて

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）、その他の対策を講じることは使用者の責任となります。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

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

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

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

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

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