Oracle® Database

移行ガイド

12cリリース1(12.1)

B71352-02(原本部品番号:E22508-11)

2014年2月

DB2、MySQL、SybaseなどのOracle以外のデータベースからOracle Databaseへ・アプリケーションの移行に関連するすべてのアクティビティにおけるインストール、構成および管理タスクについて説明します。

Oracle Database移行ガイド, 12cリリース1 (12.1)

B71352-02

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

原本著者: Roza Leyderman

原本協力者: Maitreyee Chaliha、Tanmay Choudhury、Tulika Das、Sue Pelski

原本協力者: Peter Castro、Christopher Jones、Shoaib Lari、Tom Laszewski、Aman Manglik、Robert Pang、Rajendra Pingte、Jeff D.Smith、Andrei Souleimanian

原本協力者:  Oracle Database 12cのドキュメントを、本リリースに携わった全員にとって創造の源となったMark Townsendに捧げます。

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

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

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

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)、その他の対策を講じることは使用者の責任となります。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

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

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

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

目次

例一覧

図一覧

表一覧

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

はじめに

- 対象読者

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

- 関連ドキュメント

- 表記規則

1 移行をサポートするツールおよび製品の概要

- 移行の概要

- 移行をサポートするOracle Database 12cリリース1の機能

- SQL翻訳フレームワーク

- MySQLアプリケーションのサポート

- アイデンティティ列

- 暗黙的な文の結果

- 暗黙的結果のJDBCサポート

- 暗黙的結果のOCIサポート

- 暗黙的結果のODBCサポート

- SQLからPL/SQLへのバインド処理の改善

- 問合せの行制限と行オフセットのネイティブSQLでのサポート

- アプリケーション移行に対するJDBCドライバ・サポート

- アプリケーション移行に対するODBCドライバ・サポート

- 移行が可能なその他のOracle製品

- OEM TuningおよびPerformance Packs

- Oracle GoldenGate

- Oracle Database Gateway

- Oracle SQL Developer

- 他のデータベース・ベンダーの移行サポート

2 SQL翻訳フレームワークの概要とアーキテクチャ

- SQL翻訳フレームワークを使用するタイミング

- SQL翻訳フレームワークとは

- SQL翻訳フレームワークのアーキテクチャ

- SQL翻訳フレームワークの使用方法

3 SQL翻訳フレームワークの構成

- Oracle SQL DeveloperによるSQL翻訳フレームワークのインストールと構成

- Oracle SQL Developer移行サポートの概要

- WindowsのOracle SQL Developer 3.2の設定

- Oracle SQL Developer 3.2の起動の設定

- Oracle SQL Developerの起動

- Oracle Databaseへの接続の作成

- SQL翻訳のテスト

- 翻訳プロファイルの作成とSQLトランスレータのインストール

- SQLトランスレータのインストール

- 翻訳プロファイルの作成

- SQLトランスレータ・プロファイルの使用

- コマンドラインからのSQL翻訳フレームワークのインストールと構成

- Oracle Sybaseトランスレータのインストール

- SQL翻訳プロファイルの設定

- SQL翻訳プロファイルを使用するデータベース・サービスの設定

- Oracle Real Application Clustersでのデータベース・サービスの設定

- SQL翻訳プロファイルを使用したSybase SQL翻訳のテスト

- SQLトランスレータのインストールに必要な権限の付与

4 JDBCアプリケーションとODBCアプリケーションのSQL翻訳

- JDBCアプリケーションのSQL翻訳

- SQL翻訳プロファイル

- エラー・メッセージの翻訳

- JDBC標準パラメータ・マーカーの変換

- 翻訳したOracle言語問合せの実行

- エラー翻訳

- JDBCドライバを使用したSQL翻訳

- ODBCアプリケーションのSQL翻訳

- SQL翻訳プロファイル

- エラー・メッセージの翻訳

- エラー・メッセージの翻訳

5 SQL翻訳フレームワークを使用したアプリケーションの移行例

- Sybase JDBCアプリケーションの移行

- アプリケーションの概要

- 移行の設定

- 移行の取得

- 移行の変換

- 移行の生成

- ターゲットのOracleユーザーの作成

- データの移動

- 移行レポートの生成

6 Oracle用MySQLクライアント・ライブラリ・ドライバ

- Oracle用MySQLクライアント・ライブラリ・ドライバの概要

- Oracle用MySQLクライアント・ライブラリ・ドライバのインストールと初めての使用

- Oracle用MySQLクライアント・ライブラリ・ドライバを使用した移行の概要

- Oracle用MySQLクライアント・ライブラリ・ドライバの使用

- liboramysqlドライバとのアプリケーションの再リンク

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

- サポート対象のプラットフォーム

- エラー処理

- グローバリゼーション

- 予想される相違

7 Oracle MySQLクライアント・ライブラリ・ドライバのAPIリファレンス

- データ型のマッピング

- MySQLデータ型へのOracleデータ型のマッピング

- MySQLプログラム変数データ型のデータ型変換

- MYSQL_TYPE_BLOB

- MYSQL_TYPE_DATE

- MYSQL_TYPE_DATETIME

- MYSQL_TYPE_DOUBLE

- MYSQL_TYPE_FLOAT

- MYSQL_TYPE_LONG

- MYSQL_TYPE_LONG_BLOB

- MYSQL_TYPE_LONGLONG

- MYSQL_TYPE_MEDIUM_BLOB

- MYSQL_TYPE_NEWDECIMAL

- MYSQL_TYPE_SHORT

- MYSQL_TYPE_STRING

- MYSQL_TYPE_TIME

- MYSQL_TYPE_TIMESTAMP

- MYSQL_TYPE_TINY

- MYSQL_TYPE_TINY_BLOB

- MYSQL_TYPE_VAR_STRING

- MySQL外部データ型(LOBデータ型記述子)のデータ型変換

- 日時および時間隔データ型のデータ型変換

- エラー処理

- 使用可能なMySQL API

- my_init()

- mysql_affected_rows()

- mysql_autocommit()

- mysql_change_user()

- mysql_character_set_name()

- mysql_close()

- mysql_commit()

- mysql_connect()

- mysql_create_db()

- mysql_data_seek()

- mysql_debug()

- mysql_debug_info()

- mysql_drop_db()

- mysql_dump_debug_info()

- mysql_eof()

- mysql_errno()

- mysql_error()

- mysql_escape_string()

- mysql_fetch_field()

- mysql_fetch_field_direct()

- mysql_fetch_fields()

- mysql_fetch_lengths()

- mysql_fetch_row()

- mysql_field_count()

- mysql_field_seek()

- mysql_field_tell()

- mysql_free_result()

- mysql_get_character_set_info()

- mysql_get_client_info()

- mysql_get_client_version()

- mysql_get_host_info()

- mysql_get_proto_info()

- mysql_get_server_info()

- mysql_get_server_version()

- mysql_get_ssl_cipher()

- mysql_hex_string()

- mysql_info()

- mysql_init()

- mysql_insert_id()

- mysql_kill()

- mysql_library_end()

- mysql_library_init()

- mysql_list_dbs()

- mysql_list_fields()

- mysql_list_processes()

- mysql_list_tables()

- mysql_more_results()

- mysql_next_result()

- mysql_num_fields()

- mysql_num_rows()

- mysql_options()

- mysql_ping()

- mysql_query()

- mysql_read_query_result()

- mysql_real_connect()

- mysql_real_escape_string()

- mysql_real_query()

- mysql_refresh()

- mysql_reload()

- mysql_rollback()

- mysql_row_seek()

- mysql_row_tell()

- mysql_select_db()

- mysql_send_query()

- mysql_server_end()

- mysql_server_init()

- mysql_set_character_set()

- mysql_set_local_infile_default()

- mysql_set_local_infile_handler()

- mysql_set_server_option()

- mysql_shutdown()

- mysql_sqlstate()

- mysql_ssl_set()

- mysql_stat()

- mysql_stmt_affected_rows()

- mysql_stmt_attr_get()

- mysql_stmt_attr_set()

- mysql_stmt_bind_param()

- mysql_stmt_bind_result()

- mysql_stmt_close()

- mysql_stmt_data_seek()

- mysql_stmt_errno()

- mysql_stmt_error()

- mysql_stmt_execute()

- mysql_stmt_fetch()

- mysql_stmt_fetch_column()

- mysql_stmt_field_count()

- mysql_stmt_free_result()

- mysql_stmt_init()

- mysql_stmt_insert_id()

- mysql_stmt_next_result()

- mysql_stmt_num_rows()

- mysql_stmt_param_count()

- mysql_stmt_param_metadata()

- mysql_stmt_prepare()

- mysql_stmt_reset()

- mysql_stmt_result_metadata()

- mysql_stmt_row_seek()

- mysql_stmt_row_tell()

- mysql_stmt_send_long_data()

- mysql_stmt_sqlstate()

- mysql_stmt_store_result()

- mysql_store_result()

- mysql_thread_end()

- mysql_thread_id()

- mysql_thread_init()

- mysql_thread_safe()

- mysql_use_result()

- mysql_warning_count()

8 JDBCアプリケーションのSQL翻訳のAPIリファレンス

- 翻訳プロパティ

- sqlTranslationProfile

- sqlErrorTranslationFile

- OracleTranslatingConnectionインタフェース

- SqlTranslationVersion

- createStatement()

- prepareCall()

- prepareStatement()

- getSQLTranslationVersions()

- エラー翻訳構成ファイル

用語集

索引

例一覧

- 1-1 アイデンティティ列の作成方法

- 1-2 PL/SQLブロックからの暗黙的結果の取得および処理

- 1-3 暗黙的結果の処理のためのOCIStmtGetNextResult()の使用

- 1-4 DBMS_SQL.RETURN_RESULTによる暗黙的結果を返すためのODBCの使用

- 1-5 SQLMoreResultsによる暗黙的結果を返すためのODBCの使用

- 1-6 ネストした表仮パラメータを持つサブプログラムの起動

- 1-7 バルク選択の制限方法

- 4-1 JDBCドライバを使用したOracle以外のSQL文のOracle SQL言語への翻訳

- 4-2 ODBCドライバを使用したOracle以外のSQLのOracle SQL言語への翻訳

- 6-1 MySQLへの接続と新規行の挿入

- 8-1 createStatement()メソッドの使用

- 8-2 prepareCall()メソッドの使用

- 8-3 prepareStatement()メソッドの使用

図一覧

- 2-1 実行時のSQL翻訳フレームワーク

- 3-1 Oracle SQL DeveloperのJDBC構成の確認

- 3-2 Oracle Database接続の作成

- 3-3 Oracle SQL Developerでの移行プリファレンスの設定

- 5-1 Oracle Databaseに対して実行するSybaseアプリケーション

- 5-2 JTDS JDBCドライバの設定

- 5-3 ユーザーと移行リポジトリの関連付け

- 5-4 Sybaseデータベースへの接続の作成

- 5-5 移行プロセスの取得フェーズの開始

- 5-6 「移行ウィザード」の「概要」画面

- 5-7 「移行リポジトリ」の選択

- 5-8 プロジェクト名と出力ディレクトリの指定

- 5-9 データベース接続とモードの選択

- 5-10 移行するデータベースの選択

- 5-11 移行プリファレンスの設定

- 5-12 移行プリファレンスの設定

- 5-13 移行プロセスの変換フェーズの開始

- 5-14 移行されたデータの変換

- 5-15 データベース・モードの選択

- 5-16 ターゲット・ユーザーdbo_simpledemo12cのOracle Database接続の作成

- 5-17 Oracleユーザーの対象指定

- 5-18 SybaseデータベースからOracle Databaseへのデータの移動

- 5-19 移行レポートの生成

- 5-20 移行分析レポート

- 5-21 ターゲット・ステータス・レポート

- 6-1 MySQLアプリケーション・コードがliboramysqlドライバを使用してOracleに接続する場合

表一覧

- 1-1 Oracle SQL Developerを使用した移行がサポートされるデータベース・バージョン

- 1-2 データベースでサポートされるアプリケーション

- 7-1 MySQLデータ型へのOracleデータ型のマッピング

- 7-2 MySQLプログラム変数データ型からOracle列データ型間への変換

- 7-3 LOBデータ型記述子のデータ型変換

- 7-4 日時データ型および内部データ型のデータ変換

- 8-1 翻訳プロパティ

- 表8-2 OracleTranslatingConnectionの列挙

- 8-3 OracleTranslatingConnectionメソッド

はじめに

このガイドでは、DB2、MySQL、SybaseなどのOracle以外のデータベース用に開発されたアプリケーションおよびレガシー・アプリケーションのOracle Databaseへの移行に関連するすべてのアクティビティにおけるインストール、構成および管理タスクについて説明します。また、ユーザーが実装できる移行シナリオについても順に説明します。

対象読者

このガイドは、Oracle以外のデータベースからOracle Databaseへの移行に関心のあるデータベース管理者やアプリケーション開発者を対象としています。

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

オラクル社のアクセシビリティへの取組みの詳細は、Oracle Accessibility ProgramのWebサイトhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=docaccを参照してください。

Oracleサポートへのアクセス

Oracleのお客様は、My Oracle Supportにアクセスして電子サポートを受けることができます。詳細は、http://www.oracle.com/pls/topic/lookup?ctx=acc&id=infoまたはhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=trs (聴覚障害者向け)を参照してください。

関連ドキュメント

詳細は、Oracle Databaseリリース12.1のドキュメント・セットの次のドキュメントを参照してください。

- 『Oracle Database SQL言語リファレンス』

- 『Oracle Database管理者ガイド』

- Oracle Database開発ガイド

- 『Oracle Databaseリファレンス』

表記規則

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

規則

意味

太字

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

イタリック体

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

固定幅フォント

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

1 移行をサポートするツールおよび製品の概要

この章は次の項で構成されています。

- 移行の概要

- 移行をサポートするOracle Database 12cリリース1の機能

- 移行が可能なその他のOracle製品

- 他のデータベース・ベンダーの移行サポート

移行の概要

アプリケーションをOracle Databaseに移行する前に、『Oracle Database概要』に記載されたいくつかの重要な点に注意する必要があります。

データベース中心のエンタープライズの移行について話し合う場合、データベースのスキーマとデータの実際の移行は、プロセスの一環にすぎないことを念頭に置いておくと役立ちます。コア・ビジネス・ソリューションの移行には多くの場合、組織の収益をもたらす製品やサービスを提供するために連携している複数のデータベースやアプリケーションが関係します。移行計画の準備の詳細は、『Oracle SQL Developerユーザーズ・ガイド』を参照してください。

移行をサポートするOracle Database 12cリリース1の機能

Oracle Database 12cリリース1で導入された次の機能はすべて、Oracle以外のデータベース・アプリケーションのOracle Databaseへの移行プロセスを向上させるものです。

- SQL翻訳フレームワーク

- MySQLアプリケーションのサポート

- アイデンティティ列

- 暗黙的な文の結果

- SQLからPL/SQLへのバインド処理の改善

- 問合せの行制限と行オフセットのネイティブSQLでのサポート

- アプリケーション移行に対するJDBCドライバ・サポート

- アプリケーション移行に対するODBCドライバ・サポート

SQL翻訳フレームワーク

Oracle以外のデータベースからOracle Databaseへの移行の中心としては、Oracle以外のSQL文をOracle Databaseで使用可能なSQL文に変更することなどがあります。アプリケーションのOracle以外のSQL文の変換は、手動で単調なプロセスです。労力を最小限にしたり、文を変換する必要がなくなるように、Oracle Databaseリリース12cにSQL翻訳フレームワークと呼ばれる新機能が導入されました。これを使用すると、クライアント・アプリケーションからSQL文が受け入れられ、実行時に翻訳されてから実行されます。

Oracle以外のクライアント・アプリケーション用の翻訳を処理するために、データベース内でSQL文はSQLトランスレータによって翻訳され、SQL翻訳プロファイルに登録されます。SQL文の実行時にエラーが発生すると、SQLトランスレータは、Oracleエラー・コードおよびANSI SQLSTATEを、アプリケーションで想定されているベンダー固有の値に翻訳することも行います。翻訳された文はSQL翻訳プロファイルに保存され、必要に応じて確認したり、編集できます。

SQL翻訳フレームワークの利点は次のとおりです。

- SQL文、Oracleエラー・コードおよびANSI SQLSTATEの翻訳は自動です。

- 翻訳は一元化され、検証可能です。

- 後で翻訳を抽出したり、アプリケーションに挿入したりできます。

MySQLアプリケーションのサポート

MySQL用Oracle Databaseドライバにより、MySQLデータベースと連携するために当初開発されたアプリケーションの移行が容易になります。この機能には、主に次の2つの利点があります。

- エンタープライズは、同じアプリケーションを再利用して、MySQLデータベースとOracle Databaseの両方に格納されるデータを使用できます。

- MySQLアプリケーションをOracle Databaseに移行する場合のコストと複雑さを軽減します。

Oracle Databaseではクライアント・インタフェース内のすべてのMySQL関数が同じセマンティックでサポートされます。SQL文は翻訳されますが、次の制限があります。

- 次のSQLコンストラクトは無視されます。

- 表に対するENGINE指定。Oracleが唯一のストレージ・エンジンであるためです。

- ENUMおよびSET型はVARCHAR2として使用されます。したがって、これらの値が数値コンテキストで取得される場合は索引値に変換されません。

- 次のSQLコンストラクトはエラーになるため、アプリケーションをコーディングしなおす必要があります。

- GEOMETRY、POINT、LINESTRING、POLYGON、GEOMETRYCOLLECTION、MULTILINESTRING、MULTIPOINT、MULTIPOLYGONなどの空間データ型を含む表の作成

- MySQL固有のNLSコマンド

- 次のSQLコマンドでは、Oracle固有の出力またはOracle固有の効果が得られます。

- SHOW DATABASESは1つのデータベース(つまりoracle)のみ表示します

- SHOW ENGINESはOracleエンジンのみ表示します

- CREATE PROCEDUREはOracle Database 12cリリース1のOracle PL/SQL仕様に従う必要があります。

- 次のデータ型では動作が異なります。

- ENUMデータ型の列はVARCHAR2(4000)として作成されます。挿入に対して検証は実行されません。

- SETデータ型の列はVARCHAR2(64)として作成されます。挿入に対して検証は実行されません。

詳細は、第6章『Oracle用MySQLクライアント・ライブラリ・ドライバ』および第7章「Oracle MySQLクライアント・ライブラリ・ドライバのAPIリファレンス」を参照してください。

アイデンティティ列

Oracle Database 12cリリース1は、ANSI準拠のIDENTITY列を実装しています。アイデンティティ列を使用するデータベース・システムからの移行は簡略化され、この新しい機能を活用できます。

この機能は、SEQUENCE.NEXTVALおよびSYS_GUIDで使用するDEFAULTまたはDEFAULT ON NULLセマンティックを強化することで自動増分を実装し、組込み関数やデフォルト値の暗黙的な戻りをサポートします。

例1-1では、デフォルトで生成される、アイデンティティ列を含む表を作成します。明示的なnullがアイデンティティ列に挿入されるときのデフォルトの動作は順序ジェネレータを使用することです。詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

例1-1 アイデンティティ列の作成方法

CREATE TABLE t1 (c1 NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY,
c2 VARCHAR2(10));
INSERT INTO t1(c2) VALUES (&rsquor;abc');
INSERT INTO t1 (c1, c2) VALUES (null, &rsquor;xyz');
SELECT c1, c2 FROM t1;

暗黙的な文の結果

Oracle Database 12cリリース1以降、Oracleでは、ストアド・プロシージャで実行されたSQL文の結果がサポートされます。明示的にREF CURSORを使用する必要がなく、結果は暗黙的にクライアント・アプリケーションに戻されます。この機能によって、クライアント側のコードを記述しなおすオーバーヘッドがなくなります。

暗黙的な文の結果を使用すると、対象の各問合せ(FORキーワードの後の文)がOPENカーソル変数の一部であるストアド・プロシージャを作成できます。他のベンダー環境からOracle Databaseにコードが移行された場合、PL/SQL層によって同等の機能が追加され、SELECT文でクライアントに結果を渡すことが可能になります。ストアド・プロシージャはDBMS_SQL.RETURN_RESULTプロシージャを使用して結果をクライアントに直接返すことができます。SQL*PlusのFORMATコマンドとそのバリエーションを呼び出すと、出力をカスタマイズできます。

DBMS_SQLパッケージの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。フォーマット出力の使用方法の詳細は、『SQL*Plusユーザーズ・ガイドおよびリファレンス』を参照してください。

暗黙的結果のJDBCサポート

Oracle Database 12cリリース1より、JDBCアプリケーションで次の新しい関数を使用した暗黙的結果のサポートが提供されます。

- getMoreResults

- getMoreResults(int)

- getResultSet

例1-2に示すように、これらのメソッドを使用して、PL/SQLプロシージャまたはブロックによって返された暗黙的結果を取得したり、処理できます。

例1-2 PL/SQLブロックからの暗黙的結果の取得および処理

プロシージャでfooをコールするとします。

create procedure foo as
c1 sys_refcursor;
c2 sys_refcursor;
begin
open c1 for select * from hr.employees;
dbms_sql.return_result(c1); --return to client
-- open 1 more cursor
open c2 for select * from hr.departments;
dbms_sql.return_result (c2); --return to client
end;

次のコードに、JDBC getMoreResultsメソッドを使用して、PL/SQLプロシージャによって返された暗黙的結果を取得する方法を示します。

String sql = "begin foo; end;";
...
Connection conn = DriverManager.getConnection(jdbcURL, user, password);
try {
Statement stmt = conn.createStatement ();
stmt.executeQuery (sql);

while (stmt.getMoreResults())
{
ResultSet rs = stmt.getResultSet();
System.out.println("ResultSet");
while (rs.next())
{
/* get results */
}
}
}

詳細は、『Oracle Database JDBC開発者ガイド』を参照してください

暗黙的結果のOCIサポート

Oracle Database 12cリリース1より、Oracle Call Interface (OCI)で新しい関数OCIStmtGetNextResult()を使用した暗黙的結果のサポートが提供されます。これは、Cアプリケーションによって繰り返し呼び出され、ストアド・プロシージャや匿名ブロックの各暗黙的結果を取得します。暗黙的結果は、RefCursorを経由せずにストアド・プロシージャの行を直接使用します。

例1-3に、OCIStmtGetNextResult()関数を使用して、PL/SQLプロシージャまたは無名ブロックによって返された暗黙的結果を取得したり、処理する方法を示します。

例1-3 暗黙的結果の処理のためのOCIStmtGetNextResult()の使用

OCIStmt *stmthp;
ub4      rsetcnt;
void    *result;
ub4      rtype;
char    *sql = "begin foo; end;";

OCIHandleAlloc((void *)envhp, (void **)&stmthp,
OCI_HTYPE_STMT, 0, (void **)0);

/* Prepare and execute the PL/SQL procedure. */
OCIStmtPrepare(stmthp, errhp, (oratext *)sql, strlen(sql),
OCI_NTV_SYNTAX, OCI_DEFAULT);
OCIStmtExecute(svchp, stmthp, errhp, 1, 0,
(const OCISnapshot *)0,
(OCISnapshot *)0, OCI_DEFAULT);

/* Now check if any implicit results are available. */
OCIAttrGet((void *)stmthp, OCI_HTYPE_STMT, &rsetcnt, 0,
OCI_ATTR_IMPLICIT_RESULT_COUNT, errhp);

/* Loop and retrieve the implicit result-sets.
* ResultSets are returned in the same order as in the PL/SQL
* procedure/block.
*/
while (OCIStmtGetNextResult(stmthp, errhp, &result, &rtype,
OCI_DEFAULT) == OCI_SUCCESS)
{    /* Check the type of implicit ResultSet, currently
* only supported type is OCI_RESULT_TYPE_SELECT
*/    if (rtype == OCI_RESULT_TYPE_SELECT)
{      OCIStmt *rsethp = (OCIStmt *)result;
/* Perform normal OCI actions to define and fetch rows. */
}    else
printf("unknown result type %d\n", rtype);
/* The result set handle should not be freed by the user. */
}   OCIHandleFree(stmthp, OCI_HTYPE_STMT); /* All implicit result-sets are also freed. */

関連項目:
『Oracle Call Interfaceプログラマーズ・ガイド』

暗黙的結果のODBCサポート

Oracle Database 12cリリース1より、ODBCアプリケーションで新しい関数SQLMoreResults()を使用した暗黙的結果のサポートが提供されます。ODBCドライバは、移行プロセスを向上させる次の新しいOCI APIを使用できるよう機能拡張されています。

- OCIStmtGetNextResult()関数

- OCI_ATTR_IMPLICIT_RESULT_COUNT属性

- OCI_RESULT_TYPE_SELECT属性

暗黙的結果のODBCサポートにより、ストアド・プロシージャにバンドルされた複数の結果セットを使用するSybaseおよびSQL Serverアプリケーションの移行が可能になります。Oracleでは、文またはプロシージャをサーバーに送信し、サーバーでOracle以外のSQLをOracle構文に変換することでこれを実現します。例1-4および例1-5に、ODBCの暗黙的結果の取得方法を示します。このトピックの詳細は、『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください。

例1-4 DBMS_SQL.RETURN_RESULTによる暗黙的結果を返すためのODBCの使用

create or replace procedure foo
is
c1 sys_refcursor;
c2 sys_refcursor;
begin
open c1 for select employee_id, first_name from employees where employee_id=7369;
dbms_sql.return_result(c1);
open c2 for select department_id, department_name from departments where rownum <=2;
dbms_sql.return_result(c2);
end;
/

例1-5 SQLMoreResultsによる暗黙的結果を返すためのODBCの使用

SQLLEN enind,jind;
SQLUINTEGER eno = 0;
SQLCHAR empname[STR_LEN] = "";
//Allocate HENV, HDBC, HSTMT handles
rc = SQLPrepare(hstmt, "begin foo(); end;", SQL_NTS);
rc = SQLExecute(hstmt);
//Bind columns for the first SELECT query in the procedure foo( )
rc = SQLBindCol (hstmt, 1, SQL_C_ULONG, &eno, 0, &jind);
rc = SQLBindCol (hstmt, 2, SQL_C_CHAR, empname, sizeof (empname),
&enind);
…
//so on for all the columns that needs to be fetched as per the SELECT
//query in the procedure.
//Fetch all results for first SELECT query
while ((rc = SQLFetch (hstmt)) != SQL_NO_DATA)
{
//do something
}
//Again check if there are any results available by calling
//SQLMoreResults. SQLMoreResults will return SQL_SUCCESS if any
//results are available else returns errors appropriately as explained
//in MSDN ODBC spec.
rc = SQLMoreResults ( hstmt );
if( rc == SQL_SUCCESS)
{
//If the columns for the second SELECT query are different the rebind
//the columns for the second SELECT SQL statement.
rc = SQLBindCol (hstmt, 1,…);
rc = SQLBindCol (hstmt, 2,…);
…
//Fetch the second result set
while ((rc = SQLFetch (hstmt)) != SQL_NO_DATA)
//do something
}
SQLFreeStmt(hstmt,SQL_DROP);
SQLDisconnect (hdbc);

SQLFreeConnect (hdbc);
SQLFreeEnv (henv);

SQLからPL/SQLへのバインド処理の改善

以前のリリースのOracle Databaseでは、SQL式で、SQLデータ型でない仮引数または戻り型を使用したPL/SQL関数を起動できませんでした。

Oracle Databaseリリース12cより、PL/SQL無名ブロック、SQL CALL文またはSQL問合せにより、次の型のパラメータを持つPL/SQL関数を起動できます。

- Boolean

- パッケージ仕様部で宣言されたレコード

- パッケージ仕様部で宣言されたコレクション

また、SQL TABLE演算子の機能が強化され、TABLE演算子の引数としてローカル・スコープ型のPL/SQLコレクションに問い合せることもできます。ここで、コレクションは、ネストした表、VARRAYまたはPLS_INTEGERで索引付けされたPL/SQL索引表です。

この機能(特に、TABLE演算子の柔軟性の拡張)によって、Oracle以外のストアド・プロシージャ・コードのPL/SQLへの移行が容易になります。

例1-6に、ネストした表仮パラメータを持つサブプログラムの動的起動方法を示します。このトピックの詳細は、 『Oracle Database PL/SQL言語リファレンス』を参照してください。

例1-6 ネストした表仮パラメータを持つサブプログラムの起動

CREATE OR REPLACE PACKAGE pkg AUTHID CURRENT_USER AS

TYPE names IS TABLE OF VARCHAR2(10);

PROCEDURE print_names (x names);
END pkg;
/
CREATE OR REPLACE PACKAGE BODY pkg AS
PROCEDURE print_names (x names) IS
BEGIN
FOR i IN x.FIRST .. x.LAST LOOP
DBMS_OUTPUT.PUT_LINE(x(i));
END LOOP;
END;
END pkg;
/
DECLARE
fruits   pkg.names;
dyn_stmt VARCHAR2(3000);
BEGIN
fruits := pkg.names('apple', 'banana', 'cherry');

dyn_stmt := 'BEGIN print_names(:x); END;';
EXECUTE IMMEDIATE dyn_stmt USING fruits;
END;

問合せの行制限と行オフセットのネイティブSQLでのサポート

このリリースより、Oracle Databaseに問合せの行制限と行のオフセットのネイティブSQLでのサポートを可能にする行制限句が用意されています。アプリケーションに、返される行数の制限または結果の開始行のオフセットを行う問合せがある場合、この機能によってそのような問合せのSQLの複雑性が大幅に軽減されます。

例1-7に、FETCH FIRST句を使用したバルク選択を制限する方法を示します。このトピックの詳細は、 『Oracle Database PL/SQL言語リファレンス』を参照してください。

例1-7 バルク選択の制限方法

DECLARE
TYPE SalList IS TABLE OF employees.salary%TYPE;
sals SalList;
BEGIN
SELECT salary BULK COLLECT INTO sals FROM employees
WHERE ROWNUM <= 50;

SELECT salary BULK COLLECT INTO sals FROM employees
SAMPLE (10);

SELECT salary BULK COLLECT INTO sals FROM employees
FETCH FIRST 50 ROWS ONLY;
END;
/

アプリケーション移行に対するJDBCドライバ・サポート

他のデータベースからOracle Databaseに移行するアプリケーションの多くは、JDBCを使用してデータベースに接続するJavaアプリケーションを所有しています。SQL翻訳を円滑に行うために、Oracle Database 12cリリース1に、SQL翻訳に特化した新しいJDBC APIのセットが導入されました。

関連項目:

- 「JDBCアプリケーションのSQL翻訳」

- 第8章「JDBCアプリケーションのSQL翻訳のAPIリファレンス」

- JDBCドライバの更新されたリストについては、http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html

アプリケーション移行に対するODBCドライバ・サポート

ODBCドライバは、SQL翻訳フレームワークを使用したOracle Databasesへのサード・パーティ・アプリケーションの移行をサポートします。これによって、Oracle以外のデータベースのSQL文をOracle Databaseに対して実行できます。サード・パーティODBCアプリケーションをOracle Databaseに移行する前に「SQL翻訳フレームワークの使用方法」を参照してください。

この機能をODBCアプリケーションに対して使用するには、SQL翻訳フレームワーク設定の一環で作成されたサービス名をServerName=エントリとして.odbc.iniファイルに指定する必要があります。

アプリケーションがOracle Databaseに対する実行を開始した後、Oracleエラー(ORAエラー)のネイティブ・データベースへの翻訳に対するサポートが必要な場合、.odbc.iniファイルでSQLTranslateErrors=Tエントリを有効にする必要があります。このトピックの詳細は、「ODBCアプリケーションのSQL翻訳」を参照してください。

移行が可能なその他のOracle製品

移行戦略全体の一環として、次の製品の使用をお薦めします。

- OEM TuningおよびPerformance Packs

- Oracle GoldenGate

- Oracle Database Gateway

- Oracle SQL Developer

OEM TuningおよびPerformance Packs

どのタイプの移行でも、アプリケーションで使用されるSQL文の一部を変更し、一部の索引を再構築する必要があります。Oracle SQL TuningおよびPerformance Packsでは、アプリケーション移行の最適化手順のガイダンスが提供されます。

Oracle GoldenGate

Oracle GoldenGateは、異種データ環境でのデータのレプリケーションを可能にする包括的なソフトウェア・パッケージです。製品セットにより、運用および分析用エンタープライズ・システム間での高可用性ソリューション、リアルタイム・データ統合、トランザクション変更データの取得、データ・レプリケーション、変換および検証が可能になります。

Oracle GoldenGateは、エンタープライズ全体で複数の異種プラットフォーム間でのトランザクション・レベルのデータの交換および操作を可能にします。そのモジュール方式のアーキテクチャによって、様々なトポロジ間で選択したデータ・レコード、トランザクション変更およびDDL(データ定義言語)の変更を抽出したり、レプリケートする柔軟性が提供されます。

非常に大規模なデータベースを移行する場合、あるデータベースから別のデータベースへデータをコピーする実際のプロセスはかなり時間がかかります。この間、エンタープライズは、古いソリューションを使用してサービスの配信を続ける必要がありますが、この場合、データの一部が変更されます。このような実行時の変更は、取得されてOracle Databaseに伝播される必要があります。Oracle GoldenGateで、このような変更を取得し、比較テストによって新しいソリューションが計画どおり機能することを確認できます。

Oracle Database Gateway

Oracle Database Gatewayは、異種データ・アクセスのニーズに対応します。異種分散環境で、GatewayはOracleアプリケーションからの多数のOracle以外のシステムとの統合を可能にします。IBM DB2、Microsoft SQL Server、Excelなどのデータ・ストア、IBM CICSなどのトランザクション・マネージャおよびIBM WebSphere MQなどのメッセージ・キューイング・システムの統合が可能になります。

Oracle Database Gatewaysの詳細は、http://www.oracle.com/technetwork/database/gateways/index.htmlを参照してください

Oracle SQL Developer

Oracle SQL Developerには、『Oracle SQL Developerユーザーズ・ガイド』に記載されているように、次のような移行を可能にする大規模な機能スイートがあります。

- Oracle以外のデータベースからOracle Databaseへのスキーマ、データおよびサーバー側オブジェクトなどのデータベース移行のサポート(移行ウィザード)

- SQL文の前処理およびデータ型翻訳サポートを含むアプリケーション移行のサポート(アプリケーション移行アシスタント)

他のデータベース・ベンダーの移行サポート

Oracleでは、各種データベースで実行するアプリケーションの移行サポートを用意しています。表1-1に、Oracle SQL Developerを使用した移行がサポートされるデータベース・バージョンをリストします。これは包括的なリストです。SQL翻訳は、すべてのデータベースに対して適切に機能するわけではありません。

表1-1 Oracle SQL Developerを使用した移行がサポートされるデータベース・バージョン

RDBMS

サポート対象のバージョン

SQL Server

7.0, 2000, 2005,2008

Sybase Adaptive Server(ASE)

12, 15

Access

97、2000、2002および2003

MySQL

3,4,5

DB2

AS400 V4R3、V4R5

DB2 LUW

8, 9

Teradata

12

Informix

7.3, 9.1, 9.2, 9.3, 9.4

表1-2に、一部のサードパーティ・データベースでサポートされるアプリケーションの情報を示します。翻訳フレームワークは、DB2 LUWの場合に利用できますが、DB2のトランスレータは使用できません。

表1-2 データベースでサポートされるアプリケーション

アプリケーション

SQL Server

DB2 LUW

DB2 AS400

Sybase ASE

Teradata

Informix

Oracle SQL Developer

あり

あり

なし

あり

あり

なし

Oracle Migration Workbench

なし

なし

あり

なし

なし

あり

SQL翻訳フレームワーク(SQL翻訳プロファイル)

あり

あり

あり

あり

あり

あり

SQL翻訳フレームワーク(SQLトランスレータ)

あり

一部

なし

あり

なし

なし

2 SQL翻訳フレームワークの概要とアーキテクチャ

この章では、SQL翻訳フレームワークの概要およびアーキテクチャについて、次の各項で説明します。

- SQL翻訳フレームワークを使用するタイミング

- SQL翻訳フレームワークとは

- SQL翻訳フレームワークのアーキテクチャ

- SQL翻訳フレームワークの使用方法

SQL翻訳フレームワークを使用するタイミング

SQL翻訳は、ベンダー固有のSQL構文によるSQL文を使用したクライアント・アプリケーションを移行する場合に使用します。

現在、SQL翻訳は、SybaseおよびSQL Serverにのみ使用できます。DB2の場合、サポートに制限があります。

SQL翻訳フレームワークは、オープンAPIアプリケーション(ODBCまたはJDBCなど)や、意味的に同等のOracle構文に翻訳されるSQL文を使用するアプリケーションでの使用を目的としています。これらのアプリケーションは、Oracle ODBCまたはJDBCドライバに再リンクして、翻訳サービスから実行する必要があります。

接続メカニズムについて、考えられるシナリオを次に示します。

- アプリケーションでODBC、JDBC、OLE DBまたは.NETドライバ、あるいはデータベースに接続するデータ・プロバイダを使用する場合、Oracleのドライバまたはデータ・プロバイダを置換する必要があります。

- アプリケーションでMySQLクライアント・ライブラリを使用してMySQLに接続する場合、Oracle用MySQLクライアント・ライブラリ・ドライバを含むライブラリを置換する必要があります。

- ダイレクト・トランスレータは、DB2には使用できません。詳細は、「他のデータベース・ベンダーの移行サポート」を参照してください。
アプリケーションでIBM DRDAネットワーク・プロトコルを使用してDB2に接続する場合、データベース接続設定を、Oracle用DRDAアプリケーション・サーバー経由でOracleに接続するように変更する必要があります。

- アプリケーションでベンダー専用のCクライアントAPI(Sybaseなど)を使用する場合、API呼出しを適切なOracle OCI APIに交換する必要があります。

SQL翻訳フレームワークとは

Oracle以外のデータベースと連携するように設計された各種クライアント側アプリケーションは、大幅な変更を行わないとOracle Databaseを対象として使用できません。これは、データベース・テクノロジ・ベンダーによってSQL言語が異なり、ベンダーが異なれば、異なる構文を使用してSQLの問合せや文が表されるためです。

Oracle Databaseリリース12cより、SQL翻訳フレームワークと呼ばれる、クライアント・プログラムのSQL文を外部(Oracle以外)のSQL言語からOracle Database SQLコンパイラで使用されるSQL言語に翻訳する新しいメカニズムが用意されています。

Oracle以外のSQL文の翻訳以外に、SQL翻訳フレームワークは、Oracle SQL文を別のOracle文に置き換えてセマンティックやパフォーマンスの問題に対応するためにも使用できます。このようにすると、クライアント・アプリケーションにパッチを適用せずにアプリケーションの問題を修正できます。

SQL翻訳フレームワークは、次の2つのコンポーネントで構成されています。

- SQLトランスレータ

- SQL翻訳プロファイル

SQLトランスレータ

SQLトランスレータは、Oracleまたはサード・パーティ・ベンダーによって提供されるソフトウェア・コンポーネントで、Oracle Databaseにインストールされます。クライアント・プログラムのSQL文がOracle Database SQLコンパイラで処理される前にそのSQL文を翻訳します。翻訳したSQL文の実行でエラーが発生した場合、Oracle Database SQLコンパイラによって、Oracleエラー・メッセージが生成されます。

SQLトランスレータは、Oracle以外のSQLをOracle SQLに自動的に翻訳するため、既存のクライアント側アプリケーション・コードを大幅に変更することなくOracle Databaseに対して実行できます。このため、Oracle Database記憶域への移行コストが大幅に削減されます。当然の結果として、翻訳機能は他のシナリオ(翻訳機能が、クライアントから発行された元のSQL文とその実際の実行との間の仲介に適している場合など)で使用できます。

SQL翻訳プロファイル

SQL翻訳プロファイルは、取得されたOracle以外のSQL文とその翻訳または翻訳エラーのセットを含むデータベース・オブジェクトです。SQL翻訳プロファイルを使用して、翻訳の確認、承認および変更を行います。プロファイルは1つのトランスレータと関連付けられています。ただし、1つのトランスレータは1つ以上のSQL翻訳プロファイルで使用できます。通常、アプリケーションごとに1つのSQL翻訳プロファイルがあります。あるいは、アプリケーションで翻訳された問合せを共有します。プロファイルは様々なデータベース間でエクスポートできます。

図2-1に、SQL翻訳フレームワークの実行時の概要を示します。

図2-1 実行時のSQL翻訳フレームワーク

SQL翻訳フレームワークのアーキテクチャ

SQL翻訳フレームワークの主要コンポーネントは、SQL翻訳プロファイルです。プロファイルは、トランスレータを介して処理されるOracle以外の文の集まりです。アプリケーションは、Oracle Databaseへの接続で使用するプロファイルを設定します。トランスレータは、実際の翻訳処理を行います。

ほとんどの場合、Oracle以外のSQL文とエラーは、プロファイルに登録されたSQLトランスレータで翻訳されます。トランスレータは、Oracleまたはサード・パーティ・ベンダーから提供されます。トランスレータに特定のSQL文やエラーの翻訳がない場合、そのかわりに独自のカスタム翻訳を登録できます。カスタマイズされた翻訳でトランスレータの翻訳をオーバーライドする場合、独自のカスタム翻訳も登録できます。

SQL翻訳フレームワークの使用方法

SQL翻訳フレームワークを使用する場合、次の手順を実行します。

1. SQLトランスレータを、Oracleまたはサード・パーティ・ベンダーからOracle Databaseにインストールします。

2. SQL翻訳プロファイルを作成し、そのプロファイルにSQLトランスレータを登録します。

3. データベース・サービスを作成し、アプリケーションが接続可能なサービス属性としてSQL翻訳プロファイルを指定します。
SQL翻訳プロファイルをサービス・レベルで設定すると、そのリスナー・サービスを介して実行されるSQLはすべて自動的に翻訳されることに注意してください。

ALTER SESSION文またはLOGONトリガーを使用して、トランスレータを接続レベルでアクティブにすることもできます。

4. Oracleドライバを使用してアプリケーションをリンクし、アプリケーションをOracle Databaseに接続します。SQL翻訳プロファイルを使用してデータベース・サービスに接続するよう接続設定を変更する必要もあります。

5. Oracle Databaseに対してアプリケーションのすべての機能をテストします。アプリケーションを実行すると、SQL翻訳プロファイルは、アプリケーションのSQL文を、サード・パーティのSQL言語から意味的に同等のOracle構文に翻訳し、それらをプロファイルに登録します。
トランスレータに特定のSQL文やエラーの翻訳がない場合、そのかわりに独自の翻訳を登録できます。

6. カスタム翻訳を確認して編集するか、必要に応じて新しい翻訳を登録し、アプリケーションが意図したとおりに実行されることを確認してテストを完了します。
テスト環境を構築して、アプリケーションを厳密に(回帰テスト・スイートの使用が理想)テストすることをお薦めします。

7. 本番環境へのデプロイメントの場合、サーバー側アプリケーションのオブジェクトとデータを本番Oracle Databaseで設定します。

8. プロファイルがサービス属性として設定されたデータベース・サービスを作成し、本番データベースのデータベース・サービスに接続するようアプリケーションの接続設定を変更します。アプリケーションは、テストと同様に実行されることが期待されます。

任意のSQL文を翻訳できないためにエラーが発生する可能性を監視するために、アプリケーションをモニターすることをお薦めします。まず、新規または未見のSQL文が出現した場合にエラーになって記録されるよう、プロファイル内でそのような文の自動翻訳を無効にする必要があります。翻訳が失敗してアラートが発生する場合、プロファイルを調整する必要があります。

関連項目:

- 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の新しいDBMS_SQL_TRANSLATOR PL/SQLパッケージ、および更新されたDBMS_SQLパッケージとDBMS_SERVICE PL/SQLパッケージ。

- 『Oracle Database SQL言語リファレンス』の更新されたGRANT文とREVOKE文、および新しいシステム権限。

- 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』

- 『Oracle Database管理者ガイド』

3 SQL翻訳フレームワークの構成

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

- Oracle SQL DeveloperによるSQL翻訳フレームワークのインストールと構成

- コマンドラインからのSQL翻訳フレームワークのインストールと構成

- SQLトランスレータのインストールに必要な権限の付与

Oracle SQL DeveloperによるSQL翻訳フレームワークのインストールと構成

Oracle SQL Developer 3.2のDBAナビゲータを使用して、トランスレータと翻訳プロファイルをインストールおよび管理できます。

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

- Oracle SQL Developer移行サポートの概要

- WindowsのOracle SQL Developer 3.2の設定

- Oracle Databaseへの接続の作成

- SQL翻訳のテスト

- 翻訳プロファイルの作成とSQLトランスレータのインストール

- SQLトランスレータ・プロファイルの使用

Oracle SQL Developer移行サポートの概要

SQL翻訳フレームワークは、Oracle Databaseインストールの一部としてインストールされます。ただし、アプリケーションのOracle以外のSQL言語を認識するよう構成する必要があります。フレームワークを完全に機能させるには、1つ以上のトランスレータをインストールする必要があります。

SQL翻訳機能を使用する前に、データ、スキーマ、ストアド・プロシージャ、トリガーおよびビューを移行しておく必要があります。Oracleは、Oracle SQL Developer機能によって、データベースのスキーマとデータの移行を実装します。Oracle SQL Developerでは、移行ウィザードを使用することで、Oracle以外のデータベースからOracle Databaseへの移行プロセスが簡単になります。移行ウィザードによって、データベースの移行に関連する全フェーズに利便性と包括的なガイダンスが提供されます。

Oracle SQL Developerは、Oracle以外のソース・データベースから情報を取得し、その情報を取得モデルに表します。取得モデルは、ソース・データベースの構造表現です。この表現は移行リポジトリに格納されます。移行リポジトリは、Oracle SQL Developerが移行情報の格納に使用するスキーマ・オブジェクトの集合です。

リポジトリに格納されている情報を使用して、変換モデルが生成されます。変換モデルは、Oracleデータベースで実装される移行先データベースの構造表現です。この後、取得モデルおよび変換モデルの情報を使用して、データベース・オブジェクトの比較、Oracle予約語との競合の確認および移行の進捗状況の管理を行うことができます。移行の準備が整ったら、Oracleスキーマ・オブジェクトを生成して、データを移行します。

この項では、自動ランタイム移行を可能にする後続タスクの実行方法について説明します。これらの例は、Sybaseデータベースに対して実行されるJDBCアプリケーションでSQLトランスレータを使用する場合のものですが、他のクライアント/データベース構成に対して簡単に適応できます。Oracle SQL Developerは、Sybaseトランスレータがインストールされた状態で出荷されることに注意してください。

詳細は、『Oracle SQL Developerユーザーズ・ガイド』を参照してください。

WindowsのOracle SQL Developer 3.2の設定

Oracle SQL Developer 3.2は、Oracle Database 11g JDBCドライバに付属し、このリリースではWindows用のクライアントはありません。Windowsシステムを使用している場合、Oracle Database 12c JDBCドライバを使用するようにOracle SQL Developer 3.2を有効にする必要があります。これにより、現在のリリースの機能がすべて有効になります。それには、次の手順を実行します。

- sqldeveloper\jdbc\libフォルダの名前をsqldeveloper\jdbc\lib_11gに変更します。

- 新しい空のフォルダsqldeveloper\jdbc\libを作成します。

- Oracle Database 12cリリース1 JDBC JARファイルを、新しいsqldeveloper\jdbc\libフォルダに解凍します。
Oracle Database 12cリリース1 JDBCファイルの詳細は、『Oracle Database JDBC開発者ガイド』を参照してください。

Oracle SQL Developer 3.2の起動の設定

Oracle SQL Developerは、任意のORACLE_HOME\clientディレクトリにあるJDBCドライバを自動で使用します。この動作をオーバーライドしてOracle SQL Developerがsqldeveloper\jdbc\libディレクトリのJDBCドライバを使用するようにするには、次の内容の新しいsqldeveloper.batファイルをsqldeveloperディレクトリに作成します。

set ORACLE_HOME=%CD%
start sqldeveloper.exe

Oracle SQL Developerの起動

sqldeveloper.batファイルを実行して、Oracle SQL Developerを実行します。

JDBCドライバ構成を確認するには、次の手順を実行します。

1. 「ヘルプ」メニューから、「概要」を選択します。

2. 「プロパティ」を選択します。図3-1に示すように、構成が表示されます。

図3-1 Oracle SQL DeveloperのJDBC構成の確認

Oracle Databaseへの接続の作成

図3-2に示すように、資格証明を使用してデータベースへの接続を作成します。

図3-2 Oracle Database接続の作成

次のコマンドを使用して、接続先のデータベースと、使用されるJDBCドライバを確認できます。

show jdbc

移行プリファレンスの設定

移行プリファレンスを次の方法で設定する必要があります。

1. 「ツール」メニューから、「プリファレンス」を選択します。

2. 図3-3に示すように、左パネルの「移行」オプションから「生成オプション」を選択します。

図3-3 Oracle SQL Developerでの移行プリファレンスの設定

SQL翻訳のテスト

次の手順を実行して、Sybase SQLトランスレータが適切にインストールされているかどうかを判断します。

1. Oracle SQL Developerを開きます。

2. 「ツール」メニューから、「移行」、「翻訳スクラッチ・エディタ」の順に選択します。

3. 「スクラッチ・エディタ」ツールバーで、Sybase T_SQLからPL/SQLオプションを選択します。これは、Sybaseトランスレータです。

4. 「スクラッチ・エディタ」の左パネルで、次の問合せをSybase SQL言語で入力します。

select top 10 * from dual

5. 「翻訳」アイコンをクリックします。
翻訳した問合せテキストが、エディタの右パネルに表示されます。

翻訳プロファイルの作成とSQLトランスレータのインストール

Oracle SQL DeveloperはOracle Databaseリリース12cに付属しています。約15MBのSybaseトランスレータのJavaクラスをOracle Databaseにロードします。ロードされるJavaクラスのサイズと数の点から、トランスレータをWAN経由ではなく、ローカルでインストールすることをお薦めします。

移行リポジトリがすでにあるユーザー・プロファイルにトランスレータがインストールされる場合、トランスレータは、データベースのコンテキスト(名前変更など)を取り出します。そのため、次の指定内容で新しいユーザーを作成する必要があります。

- CONNECT、RESOURCEおよびCREATE VIEW権限

- SYSTEMまたはUSER表領域(あるいはその両方)の記憶域へのアクセス

SQLトランスレータのインストール

SQLトランスレータをインストールするには、次の手順を実行します。

1. ADMIN権限を使用して、データベースにログインします。

2. コマンドラインで、次のコマンドを入力します。

GRANT CONNECT, RESOURCE, CREATE VIEW TO TranslUser identified by TranslUser;
ALTER USER TranslUser QUOTA UNLIMITED ON SYSTEM;

3. 「ビュー」メニューで、「DBA」を選択します。

4. 「DBAナビゲータ」で、「接続」を右クリックして、「接続の追加」を選択します。

5. 「接続の選択」ボックスで、既存の接続を使用する場合は接続を選択します。新しい接続を作成する場合は、手順2で説明したtransluserの情報を追加します。

6. 「接続」をクリックします。

7. 「DBAナビゲータ」で、前の手順で作成した接続を右クリックして、「SQLトランスレータのインストール」を選択します。

「SQLトランスレータのインストール」ダイアログ・ボックスが開きます。

SQLトランスレータをインストールしてSQL翻訳プロファイルを作成するには、特定の権限が必要です。SYSパスワードの指定が求められます。これにより、これらの権限を付与できます。これらの権限の詳細は、「SQLトランスレータのインストールに必要な権限の付与」を参照してください。

8. 「翻訳プロファイルの作成」に説明されている手順に従って、SQL翻訳プロファイルを作成します。

9. ユーザーに、翻訳プロファイルを実行する十分な権限があることを確認します。
追加の権限を付与するには、SYSユーザーとしてログインする必要があります。

10. SQLトランスレータをインストールします。

11. プロファイルとトランスレータがどちらも適切にインストールされていることを確認するには、適切なパッケージとJavaクラス・ファイルが「接続」ペインにあるかどうかを検証します。

翻訳プロファイルの作成

翻訳プロファイルを作成するには、次の手順を実行します。

1. 「SQLトランスレータ」ドロップダウン・ボックスで、「Sybase」または「SQLトランスレータ」を選択します。

2. 「新規プロファイルの作成」を選択します。

3. 「プロファイル名」フィールドに、SYBASE_PROFILEと入力します。

4. 「プロファイル・スキーマ」で、「翻訳プロファイルの作成とSQLトランスレータのインストール」の項で作成したユーザーの名前を選択します。

5. 「適用」をクリックします。

SQLトランスレータ・プロファイルの使用

SQL翻訳プロファイルをテストするには、次のようにSQLワークシートを使用します。

1. SYBASE_PROFILEノードを右クリックします。

2. 「プロファイルとともにSQLワークシートを開く」を選択します。

3. 翻訳するT-SQL文を入力します。

4. SYBASE_PROFILEをクリックし、「SQL翻訳」タブを選択してプロファイルを調べて、翻訳された文を表示します。

プロファイルのSQLをダブルクリックすると、そのSQLを詳細に表示できます。次の図に示すように、フィンガープリントとテンプレートが「翻訳スクラッチ・エディタ」で開きます。

コマンドラインからのSQL翻訳フレームワークのインストールと構成

次の各項では、コマンドラインからのSQL翻訳フレームワークのインストールと構成の方法について説明します。

- Oracle Sybaseトランスレータのインストール

- SQL翻訳プロファイルの設定

- SQL翻訳プロファイルを使用するデータベース・サービスの設定

- SQL翻訳プロファイルを使用したSybase SQL翻訳のテスト

Oracle Sybaseトランスレータのインストール

Oracle Sybaseトランスレータをインストールするには、「Oracle SQL DeveloperによるSQL翻訳フレームワークのインストールと構成」の説明に従い、Oracle SQL Developerを使用します。

SQL翻訳プロファイルの設定

次の手順を実行して、コマンドライン・インタフェースからSQL翻訳プロファイルを設定します。

1. systemユーザーとしてログインします。

> sqlplus system/<password>

2. 作成権限を標準ユーザーに付与します。
これにより、標準ユーザーはSQL翻訳プロファイルを作成できます。

SQL> grant create sql translation profile to <user>;

3. 標準ユーザーとしてログインします。

sqlplus <user>/<password>

4. DBMS_SQL_TRANSLATOR PL/SQLパッケージのメソッドを呼び出して、翻訳プロファイルを作成および構成します。

SQL> exec dbms_sql_translator.create_profile('sybase_profile')
SQL> exec dbms_sql_translator.set_attribute('sybase_profile',
dbms_sql_translator.attr_translator,
'migration_repo.sybase_tsql_translator')

5. SQL翻訳プロファイルのすべての権限を、Oracle Sybase翻訳スキーマに付与します。

SQL> grant all on sql translation profile sybase_profile to migration_repo;

SQL翻訳プロファイルを使用するためのデータベース・サービスの設定

この項では、標準環境やOracle Real Application Clusters環境でのデータベース・サービスの追加方法について説明します。

標準環境でのデータベース・サービスの設定

標準環境でデータベース・サービスを設定するには、次の手順を実行します。

1. DBAとしてログインします

2. DBMS_SERVICE PL/SQLパッケージを使用してデータベース・サービスの作成および呼出しを行う次のコマンドを発行します。

SQL> declare
params dbms_service.svc_parameter_array;
begin
params('SQL_TRANSLATION_PROFILE') := 'user.sybase_profile';
dbms_service.create_service('sybase_service', 'network_name', params);
dbms_service.start_service('sybase_service');
end;
/

Oracle Real Application Clustersでのデータベース・サービスの設定

Oracle Real Application Clustersでデータベース・サービスを設定するには、次の手順を実行します。

1. データベース・サービスを追加します。

srvctl add service -db db_name -service sybase_service
-sql_translation_profile user.sybase_profile

2. データベース・サービスを起動します。

srvctl start service -db db_name -service sybase_service

SQL翻訳プロファイルを使用したSybase SQL翻訳のテスト

次の手順を実行して、翻訳をテストします。

1. 標準ユーザーとしてログインします。

sqlplus user/password

2. SQLプロンプトでSQL翻訳プロファイルを指定します。

SQL> alter session set sql_translation_profile = sybase_profile;

3. データベースに、SQL*Plusを外部SQLアプリケーションとして処理するように強制します。

SQL> alter session set events = '10601 trace name context forever, level 32';

4. Sybase SQL言語を使用するSQL問合せを実行します。たとえば、次のようになります。

select top 3 * from emp;

5. 問合せは、次の結果を戻します。

EMPNO   ENAME    JOB        MGR   HIREDATE       SAL    COMM    DEPTNO
----------------------------------------------------------------------
7369    SMITH     CLERK     7902  17-DEC-80      800                20
7499    ALLEN     SALESMAN  7698  20-FEB-81     1600     300        30
7521    WARD      SALESMAN  7698  22-FEB-81     1250     500        30

SQLトランスレータのインストールに必要な権限の付与

この項では、SQLトランスレータのインストールに必要な権限について説明します。ここで作成したSYBASE_PROFILEには、次の2人のユーザーが含まれます。

- MIGREP、トランスレータがインストールされます

- TARGET_USER、プロファイルがインストールされます

SQLトランスレータのインストールに必要な権限を付与するには、次の手順を実行します。

1. SYSとして接続して、必要な権限を付与します。

connect sys/oracle as sysdba

2. MIGREPにビューの作成を許可し、無制限の割当てを付与します。

GRANT connect, resource, create view to MIGREP;
ALTER USER MIGREP QUOTA UNLIMITED ON USERS;

3. TARGET_USERにビューの作成を許可し、無制限の割当てを付与します。

GRANT connect, resource, create view to TARGET_USER;
ALTER USER MIGREP QUOTA UNLIMITED ON TARGET_USER;

4. MIGREPにSQLトランスレータのロードを許可します。

BEGIN
DBMS_JAVA.GRANT_PERMISSION(UPPER('MIGREP'), 'SYS:java.lang.RuntimePermission', 'getClassLoader', '');
END;
/

5. TARGET_USERにプロファイルの作成を許可します。

GRANT CREATE SQL TRANSLATION PROFILE TO TARGET_USER;

6. TARGET_USERに、プロファイルを使用するためのセッションの明示的な変更を許可します。

GRANT ALTER SESSION TO TARGET_USER;

この権限はSQL Developerでデフォルトでは付与されません。

7. トランスレータにプロファイルの参照を許可します。

CONNECT TARGET_USER/TARGET_USER;
GRANT ALL ON SQL TRANSLATION PROFILE SYBASE_PROFILE TO MIGREP;

8. プロファイルにトランスレータの参照を許可します。

CONNECT MIGREP/MIGREP;
GRANT EXECUTE ON SYBASE_TSQL_TRANSLATOR TO TARGET_USER;

4 JDBCアプリケーションとODBCアプリケーションのSQL翻訳

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

- JDBCアプリケーションのSQL翻訳

- ODBCアプリケーションのSQL翻訳

JDBCアプリケーションのSQL翻訳

この項では、JDBCアプリケーションでSQLトランスレータを使用する場合に理解する必要がある概念について次の各項で説明します。

- SQL翻訳プロファイル

- エラー・メッセージの翻訳

- JDBC標準パラメータ・マーカーの変換

- 翻訳したOracle言語問合せの実行

- エラー翻訳

SQL翻訳プロファイル

SQL翻訳プロファイルは、Oracle以外の言語のSQL文をどのようにOracle SQL言語に翻訳するかを指示するデータベース・スキーマ・オブジェクトです。また、Oracleエラー・コードとSQLSTATESが、他のベンダーのSQL言語に翻訳される方法も指示します。

Oracle以外のSQLデータベース用に作成されたクライアント・アプリケーションをOracleに移行する場合、SQL翻訳プロファイルを作成し、アプリケーションのSQL文とエラーを翻訳するようにそのプロファイルを構成できます。アプリケーションは、そのSQL文とエラーを翻訳するためにOracle Databaseで接続のプロファイルをランタイムで設定します。このプロファイルは、oracle.jdbc.sqlTranslationProfileプロパティを使用して設定されます。

必要に応じて、SQL文とエラーのカスタム翻訳を、サーバーのSQL翻訳プロファイルに登録できます。SQL文やエラーが翻訳されると、最初にカスタム翻訳が調べられ、一致が見つからない場合のみ、トランスレータが起動します。

「SQL翻訳フレームワークのアーキテクチャ」および「SQL翻訳プロファイルの設定」を参照してください。

エラー・メッセージの翻訳

ネイティブ・データベースによってスローされる場合に使用されるメッセージの形式で、エラー・メッセージを受信できます。データベースへの有効な接続がない場合は、エラー・メッセージ翻訳ファイルを使用してエラー・メッセージを翻訳する必要があります。データベースへの接続が確立されると、JDBCドライバはこのファイルを完全にバイパスし、すべてのエラーはサーバー上のトランスレータを使用して行われます。問合せの翻訳と同様に、サーバーにカスタム・エラー翻訳を登録することもできます。

エラー・メッセージ翻訳ファイルは、特定のコンポーネントによって記述されるわけではありません。翻訳するファイルを提供し、ファイル名を指定する必要があります。対応する接続プロパティの値としてファイル・パスを指定することもできます。

エラー・メッセージ翻訳ファイルはXML形式であり、ファイルには一連のエラーの翻訳が含まれています。各エラー翻訳には、次の情報が含まれます。

翻訳エラー

タイプ

ORAエラー番号

正の整数

Oracleエラー・メッセージ

文字列

翻訳されたエラー・コード

正の整数

翻訳されたSQL状態

正の整数

JDBC標準パラメータ・マーカーの変換

JDBCドライバは、SQL文を発行して翻訳する前に、JDBC標準パラメータ・マーカー(?)をOracleスタイルのパラメータ・マーカー(形式は:b<n>)に内部で変換します。パラメータ・マーカーの命名形式は:b<n>になります。nは、JDBC PreparedStatementでの(?)マーカーの位置を指定する増分番号です。たとえば、UPDATE employees SET salary = salary * ? WHERE employee_id = ? PreparedStatement文の場合、最初のパラメータ・マーカー(?)は:b1、2番目のパラメータ・マーカー(?)は:b2になります。変換後、ドライバは次の問合せをサーバーに送信して、翻訳を行います。

UPDATE employees SET salary = salary * :b1 WHERE employee_id = :b2

パラメータ・マーカーとしての"?"を含む問合せは、processEscapesプロパティの値をFALSEに変更すると、接続翻訳フェーズで失敗することに注意してください。翻訳が正常に行われるようにするには、processEscapesプロパティのデフォルト値のままにしておく必要があります。

パラメータ・マーカーの変換を行うと、翻訳時に発生したパラメータの変更をドライバが自動的に並び替える場合に役立ちます。変換中に、サーバーにカスタム翻訳を登録する必要がある場合、Oracle形式のパラメータ・マーカーのバージョンから登録してください。そのバージョンで、サーバーは文を受信します。JDBC形式のパラメータ・マーカーのバージョンからは登録しないでください。また、カスタム翻訳では、元の問合せのパラメータ・マーカーと同じ数のOracleスタイルのパラメータ・マーカーが必要です。

サポートされているJDBC APIの詳細は、第8章「JDBCアプリケーションのSQL翻訳のAPIリファレンス」を参照してください。

翻訳したOracle言語問合せの実行

JDBC標準パラメータ・マーカーがOracleスタイルのパラメータ・マーカーに変換されると、ドライバは、問合せをOracle言語に翻訳するためにサーバーに対してラウンドトリップを行います。翻訳された問合せをサーバーが受信すると、パラメータの並替えがドライバによって透過的に処理され、問合せは通常の問合せとして実行されます。

翻訳ができないために問合せの翻訳が不可になる場合、サーバーは、DBMS_SQL_TRANSLATOR.ATTR_RAISE_TRANSLATION_ERRORプロファイル属性の値に基づき、エラーを発生するか、NULLを戻すことができます。サーバーがNULLを戻す場合、翻訳されていない元の問合せが、ドライバによって翻訳される問合せとみなされて実行されます。

ドライバは、ローカル・キャッシュに翻訳を保持して、今後のラウンドトリップを保存します。

JDBCドライバは、DBMS_SQL_TRANSLATOR.ATTR_RAISE_TRANSLATION_ERROR属性のいずれかの値により設定される翻訳エラー(翻訳ができないために問合せが翻訳できない場合)をサポートできます。ただし、この値は、接続が確立される前にサーバー上で設定する必要があります。セッション中にこの属性の値を変更すると、動作の一貫性が保たれない場合があるので、セッション中はこの属性の値を反転しないことをお薦めします。TRANSLATE_SQLプロシージャの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

エラー翻訳

SQLExceptionが問合せ実行時にスローされた場合、ドライバは、サーバーに透過的に移動し、例外をOracleコードから元のベンダー固有のコードに翻訳します。結果として生じるSQLExceptionには、ベンダー固有のコードとSQLSTATE、およびOracle固有のSQLExceptionが原因として存在します。

問合せ翻訳と同様に、サーバーにカスタム・エラー翻訳を登録して、その翻訳を標準翻訳よりも優先にすることもできます。DBMS_SQL_TRANSLATOR.ATTR_RAISE_TRANSLATION_ERROR属性のカスタム・エラー翻訳と問合せ翻訳に対する効果は同じです。

エラーは、サーバーへの接続が確立された後でしか翻訳されないことに注意してください。そのため、サーバーへの接続が確立される前に発生するエラーの場合、エラー・メッセージの翻訳が使用されます。

JDBCドライバを使用したSQL翻訳

例4-1に、SQL翻訳でのJDBCドライバの使用方法を示します。最初に、次のようにCREATE SQL TRANSLATION PROFILE権限をHRに付与する必要があります。

conn system/manager;
grant create sql translation profile to HR;
exit

HRとしてデータベースに接続し、次のSQL文を実行します。

drop table sample_tab;
create table sample_tab (c1 number, c2 varchar2(100));
insert into sample_tab values (1, 'A');
insert into sample_tab values (1, 'A');
insert into sample_tab values (1, 'A');
commit;
exec dbms_sql_translator.drop_profile('FOO');
exec  dbms_sql_translator.create_profile('FOO');
exec  dbms_sql_translator.register_sql_translation('FOO','select row of select c1, c2 from sample_tab
where c1=:b1 and c2=:b2','select c1, c2 from sample_tab where c1=:b1 and c2=:b2');

JDBC標準パラメータ・マーカーを使用するSQL文を翻訳する次のプログラムを実行できます。

例4-1 JDBCドライバを使用したOracle以外のSQL文のOracle SQL言語への翻訳

public class SQLTransPstmt
{
static String url="jdbc:oracle:thin:@localhost:5521:jvx1";
static String user="HR", pwd="hr";
static String PROFILE = "FOO";
static String primitiveSql = "select row of select c1, c2 from sample_tab where c1=? and c2=?";

// Note that this query contains JDBC style parameter markers
// But the preceding custom translation registered in SQL is using Oracle style markers

public static void main(String[] args) throws Exception
{
OracleDataSource ods = new OracleDataSource();
ods.setURL(url);

Properties props = new Properties();
props.put("user", user);
props.put("password", pwd);

// The Following connection property makes the connection translating
props.put(OracleConnection.CONNECTION_PROPERTY_SQL_TRANSLATION_PROFILE, PROFILE);
ods.setConnectionProperties(props);
Connection conn = ods.getConnection();
System.out.println("connection for SQL translation: "+conn);

try{
// Any statements created using a translating connection are
// automatically translating. If you want to get a non-translating
// statement out of a translating connection please have a look at
// the oracle.jdbc.OracleTranslatingConnection Interface.
// Refer to "OracleTranslatingConnection Interface"
// for more information
PreparedStatement trStmt = conn.prepareStatement(primitiveSql);
trStmt.setInt(1, 1);
trStmt.setString(2, "A");
System.out.println("executeQuery for: "+primitiveSql);
ResultSet trRs = trStmt.executeQuery();
while (trRs.next())
System.out.println("C1:"+trRs.getInt(1)+", C2:"+trRs.getString(2));
trRs.close();

trStmt.close();
}catch (Exception e) {
e.printStackTrace();
}

conn.close();
}
}

ODBCアプリケーションのSQL翻訳

この項では、ODBCアプリケーションでSQLトランスレータを使用する場合に把握する必要がある概念について次の各項で説明します。

- SQL翻訳プロファイル

- エラー・メッセージの翻訳

- エラー・メッセージの翻訳

SQL翻訳プロファイル

ODBCアプリケーションの場合、SQL翻訳プロファイルはサービス・レベルで設定されます。したがって、.odbc.iniファイルで設定する必要はありません。

エラー・メッセージの翻訳

ネイティブ・データベースによってスローされる場合に使用されるメッセージの形式で、エラー・メッセージを受信できます。そのような場合、アプリケーションがOracle Databaseで実行されるよう設定されている際に、ORAエラーをネイティブ・フォームに翻訳するには、.odbc.iniファイルにSQLTranslateErrors=Tエントリを設定する必要があります。

エラー・メッセージの翻訳

例4-2に、SQL翻訳でのODBCドライバの使用方法を示します。この例で使用されるSQL文ではSybase TOP N構文を使用します。

「SQL翻訳フレームワークの使用方法」の項で作成したデータベース・サービス名を使用して.odbc.iniファイルにServerName=エントリを設定する必要があることに注意してください。ネイティブ・データベース・エラーへのOracleエラーの変換が必要な場合は、.odbc.iniファイルにSQLTranslateErros=Tエントリも設定します。

例4-2 ODBCドライバを使用したOracle以外のSQLのOracle SQL言語への翻訳

int main()
{
HENV m_henv;          /* environment handle */
HDBC m_hdbc;          /* connection handle */
HSTMT m_hstmt;        /* statement handle */
int retCode;          /* return code */
char dbdsn[100];      /* Initialize with the DSN name of connection */
const  char szUID[10];/*Initialize with appropriate Username of DB */
const char szPWD[10]; /* Initialize with appropriate Password */

char query1[100]="select top 3 col1 from babel_tab3 order by col1";
SQLLEN paramInd = SQL_NTS;
SQLUINTEGER   no = 0;

//Allocate HENV, HDBC, HSTMT handles
retCode = SQLAllocHandle (SQL_HANDLE_ENV, SQL_NULL_HANDLE, &m_henv);
if (retCode != SQL_SUCCESS && retCode != SQL_SUCCESS_WITH_INFO)
{
printf ("SQLAllocHandle failed \n");
printSQLError (1, m_henv);
}

retCode = SQLSetEnvAttr (m_henv, SQL_ATTR_ODBC_VERSION, (void *) SQL_OV_ODBC3,
SQL_IS_INTEGER);
if (retCode != SQL_SUCCESS && retCode != SQL_SUCCESS_WITH_INFO)
{
printf ("SQLSetEnvAttr failed\n");
printSQLError (1, m_henv);
}

retCode = SQLAllocHandle (SQL_HANDLE_DBC, m_henv, &m_hdbc);
if (retCode != SQL_SUCCESS && retCode != SQL_SUCCESS_WITH_INFO)
{
printf ("SQLAllocHandle failed\n");
printSQLError (2, m_hdbc);
}

retCode = SQLConnect (m_hdbc, (SQLCHAR *) dbdsn,SQL_NTS,
(SQLCHAR *) szUID, SQL_NTS,
(SQLCHAR *) szPWD, SQL_NTS);
if (retCode != SQL_SUCCESS && retCode != SQL_SUCCESS_WITH_INFO)
{
printf ("SQLConnect failed to connect\n");
printSQLError (2, m_hdbc);
}

retCode = SQLAllocHandle (SQL_HANDLE_STMT, m_hdbc, &m_hstmt);
if (retCode != SQL_SUCCESS && retCode != SQL_SUCCESS_WITH_INFO)
{
printf ("SQLAllocHandle with SQL_HANDLE_STMT failed\n");
printSQLError (3, m_hstmt);
}

/* Prepare and Execute the Sybase Top-N syntax SQL statements */

retCode = SQLPrepare (m_hstmt, (SQLCHAR *) query1, SQL_NTS);
if (retCode != SQL_SUCCESS && retCode != SQL_SUCCESS_WITH_INFO)
{
printf ("SQLPrepare failed\n");
printSQLError (3, m_hstmt);
}

retCode=SQLExecute(m_hstmt);
if (retCode != SQL_SUCCESS && retCode != SQL_SUCCESS_WITH_INFO)
{
printf ("SQLExecute-failed\n");
printSQLError (3, m_hstmt);
}

while (retCode = SQLFetch(m_hstmt)!=SQL_NO_DATA)
{
retCode=SQLGetData(m_hstmt,1,SQL_C_ULONG, &no, 0, &paramInd);
if (retCode != SQL_SUCCESS && retCode != SQL_SUCCESS_WITH_INFO)
{
printf ("SQLFetch failed\n");
printSQLError (3, m_hstmt);
}
printf("Value is %d\n",no);
}

retCode = SQLCloseCursor (m_hstmt);
if (retCode != SQL_SUCCESS && retCode != SQL_SUCCESS_WITH_INFO)
printf ("SQLCloseCursor failed\n");

printf ("cleanup()\n");
retCode = SQLFreeHandle (SQL_HANDLE_STMT, m_hstmt);
if (retCode != SQL_SUCCESS && retCode != SQL_SUCCESS_WITH_INFO)
{
printf ("SQLFreeHandle failed\n");
printSQLError (3, m_hstmt);
}

retCode = SQLDisconnect (m_hdbc);
if (retCode != SQL_SUCCESS && retCode != SQL_SUCCESS_WITH_INFO)
{
printf ("SQLDisconnect failed\n");
printSQLError (2, m_hdbc);
}

retCode = SQLFreeHandle (SQL_HANDLE_DBC, m_hdbc);
if (retCode != SQL_SUCCESS && retCode != SQL_SUCCESS_WITH_INFO)
{
printf ("SQLFreeHandle failed\n");
printSQLError (2, m_hdbc);
}

retCode = SQLFreeHandle (SQL_HANDLE_ENV, m_henv);
if (retCode != SQL_SUCCESS && retCode != SQL_SUCCESS_WITH_INFO)
{
printf ("SQLFreeHandle failed\n");
printSQLError (1, m_henv);
}
}

5 SQL翻訳フレームワークを使用したアプリケーションの移行例

この章では、次の移行例について説明します。

- Sybase JDBCアプリケーションの移行

- 移行レポートの生成

Sybase JDBCアプリケーションの移行

図5-1に、Sybaseデータベースに問合せを行うようにコード化されているアプリケーションが、SQL翻訳フレームワークを使用して、かわりにOracle Databaseに格納される情報に問合せを行う方法を示します。

図5-1 Oracle Databaseに対して実行するSybaseアプリケーション

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

- アプリケーションの概要

- 移行の設定

- 移行の取得

- 移行の変換

- 移行の生成

- データの移動

アプリケーションの概要

この例で使用されるSybaseデータベースには、3つの表と5つのプロシージャがあり、次の機能を備えています。

- IDENTITY列

- IDENTITY列を含む表へのINSERT文

- 4000文字を超えるサイズのVARCHAR列

- プロシージャから戻される複数の暗黙的結果セット

Javaアプリケーションは、JDBCを使用してこのSybaseデータベースに接続します。

移行の設定

次の手順を実行して、移行を設定します。

1. JDBCドライバJTDS 1.2をダウンロードします。

2. JTDSをサード・パーティJDBCドライバとして次のように追加します。

1. 「ツール」メニューから、「プリファレンス」を選択します。

2. 図5-2に示すように、右パネルの「データベース」オプションから「サード・パーティJDBCドライバ」を選択します。

図5-2 JTDS JDBCドライバの設定

3. 「エントリの追加」をクリックします。
「パス・エントリの選択」ボックスが表示されます。

4. jtds-1.2.jarファイルを選択して、「選択」をクリックします。

5. 「OK」をクリックします。

6. 情報の移行先のOracle Databaseに接続します。

7. 次のコマンドで、接続がOracle Database 12c JDBCドライバを使用していることを確認します。

show jdbc

8. 次のコマンドで、移行リポジトリ用の新しいユーザーmigrepをOracle Databaseで作成します。

GRANT CONNECT,RESOURCE,CREATE VIEW to migrep INDENTIFIED BY migrep;
ALTER USER migrep QUOTA UNLIMITED to users;

9. 図5-3に示すように、migrepユーザーとしてデータベースに接続し、移行リポジトリとユーザーを関連付けます。

図5-3 ユーザーと移行リポジトリの関連付け

10. 図5-4に示すように、Sybaseデータベース(この例ではsimpledemo12c)への接続を作成します。

図5-4 Sybaseデータベースへの接続の作成

注意:
移行プロセスには、取得、変換、生成およびデータ移動の4つのフェーズがあります。ベスト・プラクティスとして、移行プロセスの各フェーズを完了し、「サマリー」ページで問題を確認してから、次のフェーズに進みます。移行ウィザードでは、各手順を順番に完了したらウィザードに戻り、次の手順を完了することができます。このためには、各フェーズの完了後に「サマリー・ページに進む」チェック・ボックスを選択して、「次へ」をクリックします。

移行の取得

次の手順を実行して、移行を取得します。

1. 図5-5に示すように、simpledemo12c Sybaseデータベースを右クリックして、「Oracleへの移行」オプションを選択します。

図5-5 移行プロセスの取得フェーズの開始

図5-6に示すように、移行ウィザードが開きます。

「次へ」をクリックします。

図5-6 移行ウィザードの「概要」画面

2. 図5-7に示すように、「移行リポジトリ」を選択します。
「次へ」をクリックします。

図5-7 「移行リポジトリ」の選択

3. 図5-8に示すように、プロジェクト名を入力して、ファイルを置く出力ディレクトリを指定します。
「次へ」をクリックします。

図5-8 プロジェクト名と出力ディレクトリの指定

4. 図5-9に示すように、データベース接続とモードを選択します。
「次へ」をクリックします。

図5-9 データベース接続とモードの選択

5. データベース(この場合はsimpledemo12c)を選択します。選択するには、図5-10に示すように、データベースを「使用可能なデータベース」から「選択したデータベース」に移動します。
「サマリー・ページに進む」をクリックして、移行プロセスの次のフェーズに進む前に取得フェーズを確認します。

「次へ」をクリックします。

図5-10 移行するデータベースの選択

取得フェーズでは、この時点で選択したデータベースのスナップショットを保存します。実際の表データではなく、オブジェクト定義のみが取得されます。この取得したスナップショットは、「移行プロジェクト」ナビゲータで表示できます。

スナップショットはデータベースへの接続ではありませんが、これを使用すると、移行リポジトリに保存された情報を通じて参照のみを行うことができることに注意してください。

移行の変換

変換フェーズを開始する前に、移行プリファレンスを設定する必要があります。それには、次の手順を実行します。

- 「ツール」メニューから、「プリファレンス」、「移行」、「トランスレータ」の順に選択します。図5-11に示すように、「複合トリガーの生成」オプションを選択します。

図5-11 移行プリファレンスの設定

- 「ツール」メニューから、「プリファレンス」、「移行」、「生成オプション」の順に選択します。図5-12に示すように、「移行時にOracle Database 12cの機能をすべて使用」オプションを選択します。

図5-12 移行プリファレンスの設定

次の手順を実行して、移行プロセスの変換フェーズを開始します。

1. 図5-13に示すように、取得モデル・ノードを右クリックして、「変換」を選択します。

図5-13 移行プロセスの変換フェーズの開始

図5-14に示すように、移行ウィザードが変換フェーズで開きます。

図5-14 移行されたデータの変換

2. 「サマリー・ページに進む」を選択して、「次へ」をクリックします。

3. 「終了」をクリックします。

変換フェーズ中に、オブジェクト名は有効なOracle名に解決されます。データ型は、Oracle Database型に変換され、T-SQL定義オブジェクト(ストアド・プロシージャ、ビューなど)は、Oracle PL/SQLに変換されます。変換されたモデルが作成され、「移行プロジェクト」ナビゲータで参照できます。変換されたプロシージャは、変換されたモデルで確認できます。

変換されたモデルは、実際のOracle Databaseではありませんが、Oracle Databaseのプロトタイプになることに注意してください。情報は、引き続き、移行リポジトリ表にのみ格納されます。

移行の生成

移行生成フェーズでは、ターゲットのOracle Databaseにオブジェクトが作成されます。スクリプトが作成され、選択したOracle接続に対して次の2つの方法で実行されます。

- オフライン・モードでは、スクリプトはSQLワークシートで開き、接続を選択して手動で実行する必要があります。

- オンライン・モードでは、ウィザードでターゲットの接続を指定する必要があります。ウィザードにより、スクリプトは自動で実行されます。

次の手順では、オフライン・モードでの移行プロセスの生成フェーズの実行方法を示します。

1. 「移行プロジェクト」パネルで「変換されたデータベース・オブジェクト」を右クリックし、「ターゲットの生成」を選択します。

2. 図5-15に示すように、移行ウィザードのデータベース・モードに「オフライン」を選択します。
「次へ」をクリックします。

図5-15 データベース・モードの選択

3. 図5-16に示すように、ターゲットのOracle Databaseで接続を選択します。

図5-16 ターゲット・ユーザーdbo_simpledemo12cのOracle Database接続の作成

この手順で選択した接続に、データベース・オブジェクトは作成されません。ただし、この接続には、他のユーザーやオブジェクトを作成する十分な権限が必要です。

ターゲットのOracleユーザーの作成

図5-17に示すように、新規作成したユーザー(手順3で説明)への接続を作成します。この時点で、Sybaseデータベース・オブジェクトはOracle Databaseに移行されますが、データは移行されていません。

図5-17 Oracleユーザーの対象指定

データの移動

次の手順を実行して、データをOracle Databaseに移動します。

1. 図5-18に示すように、「変換されたデータベース・オブジェクト」ノードを右クリックして、「データの移動」を選択します。
「次へ」をクリックします。

図5-18 SybaseデータベースからOracle Databaseへのデータの移動

2. 「データの移動」画面で、データ移動モードに「オンライン」を選択します。
移行プロセスに大容量のデータが含まれる場合は、データ移動モードに「オフライン」を選択できます。

3. 「次へ」をクリックします。「サマリー」画面が表示されます。

4. 「終了」をクリックします。
データベース・オブジェクトを参照して、データがOracle Databaseに移動していることを確認できます。

詳細は、『Oracle SQL Developerユーザーズ・ガイド』を参照してください。

移行レポートの生成

Oracle SQL Developerは、移行プロセスに関するレポートを多数用意しており、解決するタスクと問題の特定に役立ちます。「移行プロジェクト」ナビゲータで、移行したプロジェクトをクリックまたはダブルクリックします。図5-19に示すように、複数のタブや子レポートを含むレポートが右パネルに表示されます。

図5-19 移行レポートの生成

図5-20に示すように、分析レポートには、移行したデータベースのサイズ(オブジェクトの数、行サイズなど)に関する情報が表示されます。

図5-20 移行分析レポート

ターゲット・ステータス・レポートには、ターゲット・データベースでの移行済オブジェクトのステータスに関する情報が表示されます。最初に、十分な権限を持つターゲット接続を選択し、他のスキーマ・オブジェクトのステータスを表示してから「リフレッシュ」を選択します。変換されたモデルにあるオブジェクトでも、ターゲットOracle Databaseにないオブジェクトは、欠落したものとしてリスト表示されます。これらのオブジェクトは有効または無効のいずれかになります。

図5-21 ターゲット・ステータス・レポート

「データ品質」タブには、ソース・データベースと比較した、ターゲットOracle Databaseの行数に関する情報が表示されます。次の手順を実行して、データベースを比較します。

1. 変換したモデル、ソース接続およびターゲット接続を選択します。

2. 分析をクリックします。

3. 「リフレッシュ」をクリックします。
ソース・データベースとターゲット・データベースの各表に対してcount(*)ファンクションが実行されます。そのため、本番データに対してこの操作を実行しないようにしてください。

6 Oracle用MySQLクライアント・ライブラリ・ドライバ

この章では、Oracle DatabaseのMySQLクライアント・ライブラリ・ドライバと、MySQLからOracleへのアプリケーションの移行におけるその使用について説明します。

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

- Oracle用MySQLクライアント・ライブラリ・ドライバの概要

- Oracle用MySQLクライアント・ライブラリ・ドライバを使用した移行の概要

- Oracle用MySQLクライアント・ライブラリ・ドライバの使用

関連項目:
MySQLプログラムのサポートの詳細は、第7章「Oracle MySQLクライアント・ライブラリ・ドライバのAPIリファレンス」を参照してください。

Oracle用MySQLクライアント・ライブラリ・ドライバの概要

Oracle Database 12cリリース1用MySQLクライアント・ライブラリ・ドライバ(liboramysql)はMySQL Commercial Connector/C 6.0クライアント・ライブラリに代わるものです。liboramysqlドライバは類似のAPIを実装しているため、MySQL用に開発されたCベースのアプリケーションとツールはOracle Databaseに接続できます。ドライバを使用すると、最小限のコードの変更でアプリケーションをMySQLからOracle Databaseに移行できます。

liboramysqlドライバは、Oracle Call Interface(OCI)を使用してOracle Databaseに接続します。

図6-1 MySQLアプリケーション・コードがliboramysqlドライバを使用してOracleに接続する場合

例6-1のCコード・スニペットで、MySQLへの接続方法と、表に行を挿入する方法を示します。実行可能ファイルがlibmysqlclientライブラリではなくliboramysqlライブラリを使用してリンクされている場合、接続資格証明の更新後、コードを変更することなくOracle Databaseを対象に実行できます。

例6-1 MySQLへの接続と新規行の挿入

c = mysql_init(NULL);
mysql_real_connect(c, "myhost", "myun", "mypw", "mydb", 0, NULL, 0);
mysql_query(c, "insert into mytable values (1,2)");
mysql_close(c);

データベースのスキーマとデータをOracleに個別に移行する必要があり、liboramysqlライブラリはSQL文を翻訳しませんが、アプリケーション・コードを変更する必要がないため、Oracle Databaseへの移行時の労力が大幅に軽減されます。

カスタムCアプリケーションは、liboramysqlライブラリを使用してOracle Databaseに簡単に移行できます。

Oracle用MySQLクライアント・ライブラリ・ドライバのインストールと初めての使用

Oracle用MySQLクライアント・ライブラリ・ドライバは、liboramysql.so共有ライブラリ(Linuxの場合)またはoramysql.dll動的リンク・ライブラリ(DLL) (Windowsの場合)内のファイルとして提供されます。ドライバは、Oracle Instant Client BasicおよびBasic Liteパッケージの一部としてパッケージされ、OTNからダウンロードできます。http://www.oracle.com/technetwork/topics/linuxsoft-082809.htmlおよびhttp://www.oracle.com/technetwork/topics/winsoft-085727.htmlを参照してください。

ドライバは、Oracle Client共有ライブラリ(Linuxの場合はlibclntsh.so、Windowsの場合はoci.dll)と同じディレクトリにインストールする必要があります。通常、このインストール・ディレクトリを含めるように、オペレーティング・システムの環境変数(Linuxの場合はLD_LIBRARY_PATH、Windowsの場合はPATH)を設定する必要があります。

ORACLE_HOMEインストールの場合、ドライバ・ライブラリは、$ORACLE_HOME/libディレクトリ(Linuxの場合)および%ORACLE_HOME%\binディレクトリ(Windowsの場合)にインストールされます。Instant Client ZIPファイルの場合、ライブラリはinstantclient_12_1ディレクトリにあります。Instant Client RPMインストールの場合、ライブラリは、32ビットLinuxプラットフォームまたは64ビットLinuxプラットフォームでそれぞれ/usr/lib/oracle/12.1/client/libディレクトリまたは/usr/lib/oracle/12.1/client64/libディレクトリにインストールされます。

Oracle用MySQLクライアント・ライブラリ・ドライバを使用した移行の概要

Oracle DatabaseにCベースのMySQLアプリケーションを移行するには、次の手順を行う必要があります。

1. MySQLデータベースに対してアプリケーションが実行されることを確認します。
これにより、移行プロセスが、既知の基本的な機能で開始されます。

2. libmysqlclientライブラリをliboramysqlライブラリに置き換えます。
libmysqlclientライブラリではなくliboramysqlライブラリを使用するようにアプリケーションを再リンクする必要があります。

3. アプリケーション・スキーマをOracle Databaseに移行します。
Oracle DDLおよびタイプを使用するようにスキーマを移行する必要があります。このプロセスには、Oracle SQL Developerが役立ちます。

詳細は、『Oracle SQL Developerユーザーズ・ガイド』を参照してください。

4. アプリケーションで使用されるすべてのSQL文を確認します。
必要に応じて、Oracle構文を使用するようにアプリケーションのSQL文を変更するか、アプリケーションの実行時に変換を自動で行うSQLトランスレータを実装します。Oracle DatabaseでサポートされないMySQL機能に依存するロジックを記述しなおします。

第4章「JDBCアプリケーションとODBCアプリケーションのSQL翻訳」を参照してください。

5. Oracle Databaseに接続するようアプリケーションの接続文字列を更新します。
接続呼出しのhostパラメータでOracle簡易接続構文またはtnsnames.ora接続識別子を使用します。

6. Oracle Databaseでアプリケーションをテストします。
Oracle Databaseに対してアプリケーションを検証します。

Oracle用MySQLクライアント・ライブラリ・ドライバの使用

liboramysql APIはMySQL Commercial Connector/C 6.0と互換性があります。Oracle Database用MySQLドライバであるliboramysqlは、MySQL API呼出しをOracle Call Interface(OCI)呼出しへ翻訳、およびOracleデータ型とMySQLデータ型間での翻訳を行います。

既存のMySQLベースのアプリケーションは、liboramysqlドライバを使用するように再リンクし、Oracle Databaseを新しいデータ・ソースにすることができます。liboramysqlドライバでは、Oracle Databaseへの接続のみがサポートされることに注意してください。同じアプリケーション内でMySQLデータベースとOracle Databaseの両方に同時に接続することはできません。

データ型マッピングとAPIの互換性の詳細は、第7章「Oracle MySQLクライアント・ライブラリ・ドライバのAPIリファレンス」を参照してください。詳細情報は、『Oracle SQL Developerユーザーズ・ガイド』にも記載されています。

liboramysqlドライバは、SQL文を翻訳しません。Oracle Databaseに対して無効な文を記述しなおす必要があります。これは、アプリケーションで直接行うか、SQLトランスレータを使用して行います。アプリケーションのスキーマとデータも個別に移行する必要があります。Oracle SQL Developerにより、このプロセスは自動化されます。

古いバージョンのOracle Databaseに対するバージョン間OCI接続が存在する場合、liboramysqlドライバを使用して、古いバージョンに接続します。

次の各項でこれらについて説明します。

- liboramysqlドライバとのアプリケーションの再リンク

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

- サポート対象のプラットフォーム

- エラー処理

- グローバリゼーション

- 予想される相違

liboramysqlドライバとのアプリケーションの再リンク

liboramysqlライブラリを使用する基本的な手順として、新しいライブラリを使用するようにアプリケーションを再リンクします。liboramysqlライブラリは、MySQL Commercial Connector/C 6.0.2パッケージのlibmysqlclient.soライブラリと互換性があるため、Oracle Databaseに移行する前に、バージョンの影響を受けるアプリケーションをMySQL Commercial Connector/C 6.0.2を使用してビルドし、検証する必要があります。

ソース・コードからコンパイルされたパブリック・ソフトウェアのインストール・スクリプトでは、通常、MySQLコンポーネントは事前に定義されたシステム・ディレクトリ構造に従うと想定されます。これは、Instant Client SDKのdemoディレクトリ内のsetuporamysql.shスクリプトを使用して行います。

アプリケーションに応じて次の方法を1つ以上使用し、アプリケーションをliboramysqlライブラリに再リンクします。

- 直接liboramysqlライブラリを使用してビルドします。
liboramysqlライブラリを使用するようビルド・スクリプトを更新し、このOracleライブラリを直接使用するカスタム・アプリケーションをビルドできます。

- liboramysqlライブラリを使用してMySQL Commercial Connector/Cディレクトリをエミュレートします。
Instant Client SDKのsetuporamysql.shライブラリで、MySQL Commercial Connector/Cインストールをエミュレートしたディレクトリ構造の作成方法が示されます。エミュレートされたこのディレクトリを使用してアプリケーションをビルドできます。

- LD_PRELOAD環境変数を使用します。
事前構成のプログラムでLD_PRELOAD環境変数を使用してliboramysqlライブラリにリンクできます。ただし、プログラムでdlopen()メソッドを使用している場合、この環境変数の値を変更すると機能しない場合があります。

- liboramysqlライブラリを複製します。
次の手順に従って、liboramysqlライブラリの名前を、アプリケーションで使用されているMySQLクライアント・ライブラリ名に変更します。

1. lddコマンドを使用して、アプリケーションのリンク先のMySQLライブラリを特定します。

$ ldd yourprogram
...
libmysqlclient.so.16 => /usr/lib/libmysqlclient.so.16 (0x00007f9004e7f000)
...

2. 次のシンボリック・リンクをOracleソフトウェア所有者ユーザーとして作成します。

$ ln -s $ORACLE_HOME/lib/liboramysql12.so $ORACLE_HOME/lib/libmysqlclient.so.16

3. libmysqlclientライブラリを使用していたアプリケーション用に$ORACLE_HOME/libをLD_LIBRARY_PATH環境変数に追加します。

$ export LD_LIBRARY_PATH=$ORACLE_HOME/lib

- システムMySQLクライアント・ライブラリを置き換えます。
ターゲット・システムのMySQLクライアント・ライブラリの名前を変更し、その場所の新しいライブラリにリンクします。このオプションは、MySQLを使用するシステムのすべてのアプリケーションに影響を与えるため、絶対に必要な場合のみ行ってください。

# mv /usr/lib64/libmysqlclient.so.16 /usr/lib64/libmysqlclient.so.16.backup
# ln -s $ORACLE_HOME/lib/liboramysql12.so /usr/lib64/libmysqlclient.so.16

MySQLアプリケーションをソース・コードから再ビルドできない場合、まず、MySQL Connector/C 6.0.2パッケージのlibmysqlclient.soライブラリに対してアプリケーションをリンクする必要があります。これによって、liboramysqlライブラリ内のデータ構造とのバイナリ互換性が保証されます。

Oracle Databaseへの接続

liboramysqlライブラリを使用してOracle Databaseに接続するには、接続呼出しのhostパラメータでOracle簡易接続構文またはtnsnames.ora接続識別子を使用します。

mysql_real_connect(c, "localhost/pdborcl", "myun", "mypw", NULL, 0, NULL, 0);

サポート対象のプラットフォーム

Oracle用MySQLクライアント・ライブラリ・ドライバは、Oracle Instant Clientがサポートされているプラットフォームで使用できます。

サポート対象プラットフォームのリストについては、OracleのSupport Certificationサイト(https://support.oracle.com)を参照してください。

エラー処理

OCIクライアント・コードまたはOracleサーバーで生成されるすべてのエラーは、エラー後にmysql_errno()メソッドまたはmysql_error()メソッドが呼び出されると、アプリケーションに渡されます。

グローバリゼーション

アプリケーションで想定される日付形式は、Oracle DatabaseのNLS_DATE_FORMAT環境変数を使用して設定されるか、同等のALTER SESSIONコマンドで接続後に変更されます。NLS_LANGも環境で設定される場合、NLS_DATE_FORMAT環境変数のみが使用されます。

予想される相違

liboramysqlライブラリの一部のAPIは、MySQLデータベースとOracle Databaseとの間の根本的な違いから、必然的に異なる結果を返します。これらのAPIを使用する既存のアプリケーションはロジックの変更が必要な可能性があります。これらの違いの詳細は、第7章「Oracle MySQLクライアント・ライブラリ・ドライバのAPIリファレンス」を参照してください。

7 Oracle MySQLクライアント・ライブラリ・ドライバのAPIリファレンス

この章では、MySQLからの移行をサポートするAPIについて説明します。これは、Oracle Databaseリリース12cより利用できます。

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

- データ型のマッピング

- 使用可能なMySQL API

- エラー処理

MySQL C APIのドキュメントについては、MySQL 5.5のドキュメントを参照してください。

データ型のマッピング

Oracleデータベースの型については、『Oracle Call Interfaceプログラマーズ・ガイド』の内部データ型に関する項に記載されています。

MySQLのデータ型はすべてMySQLのドキュメントに記載されています。

MySQL C APIではMYSQL_TYPE_シンボルを使用して、MySQLデータベースとの間でデータを処理します。これらの型シンボルは、サーバーでMySQLデータ型にマップされます。

たとえば、MYSQL_TYPE_VAR_STRINGはサーバーでVARCHARにマップされます。

MySQLデータ型へのOracleデータ型のマッピング

この表に、mysql_fetch_field_*コールから返されたMYSQL_FIELDパラメータの型フィールドの値を示します。Oracleデータベースの型はMySQL C APIデータ型にマップされます。

たとえば、VARCHAR2列はMYSQL_TYPE_VAR_STRINGによって表されます。

MySQLアプリケーションをOracleに移行する場合、この表を使用することをお薦めします。Oracle用MySQLクライアント・ライブラリ・ドライバで、MySQLとOracleとの間のデータ型の変換が行われます。

表7-1 MySQLデータ型へのOracleデータ型のマッピング

Oracleデータ型

MySQLデータ型へのマップ

CHAR

MYSQL_TYPE_VAR_STRING

NCHAR

MYSQL_TYPE_VAR_STRING

NVARCHAR2

MYSQL_TYPE_VAR_STRING

VARCHAR2

MYSQL_TYPE_VAR_STRING

NUMBER

MYSQL_TYPE_NEWDECIMAL

LONG

MYSQL_TYPE_BLOB

CLOB

MYSQL_TYPE_BLOB

NCLOB

MYSQL_TYPE_BLOB

DATE

MYSQL_TYPE_DATETIME

RAW

MYSQL_TYPE_VAR_STRING

BLOB

MYSQL_TYPE_BLOB

LONG RAW

MYSQL_TYPE_BLOB

ROWID

MYSQL_TYPE_VAR_STRING

UROWID

MYSQL_TYPE_VAR_STRING

BINARY FLOAT

MYSQL_TYPE_FLOAT

BINARY DOUBLE

MYSQL_TYPE_DOUBLE

ユーザー定義型(オブジェクト型、VARRAY、ネストした表)

サポートされていません

REF

サポートされていません

BFILE

MYSQL_TYPE_BLOB

TIMESTAMP

MYSQL_TYPE_DATETIME

TIMESTAMPWITHTIMEZONE

MYSQL_TYPE_DATETIME

TIMESTAMPWITHLOCALTIMEZONE

MYSQL_TYPE_DATETIME

INTERVALYEARTOMONTH

MYSQL_TYPE_VAR_STRING

INTERVALDAYTOSECOND

MYSQL_TYPE_VAR_STRING

MySQLプログラム変数データ型のデータ型変換

mysql_stmt_bind_param()およびmysql_stmt_bind_result()の呼出しは、Cプログラム変数とデータベース列値との変換に使用されます。同様に、OCIでは、サーバーのデータ型からクライアントの様々なデータ型に変換するための豊富なサポートが提供されます。

Cプログラム値からデータベース列値への入力変換は、mysql_stmt_bind_param()を起動して処理されます。Cプログラム値への出力は、mysql_stmt_bind_result()へのコールにより処理されます。

表7-2は、MySQLプログラム変数データ型とOracle列データ型間の稼働可能な変換をまとめたものです。表内で使用されている値は次のとおりです。

- I: 入力変換がサポートされます

- O: 出力変換がサポートされます

- I/O: 入力と出力の両方の変換がサポートされます

- -: 変換はサポートされていません。

変換の選択肢を確定する前に、各データ型に対応する注意を必ずお読みください。

表7-2 MySQLプログラム変数データ型からOracle列データ型間への変換

MySQLプログラム変数データ型

CHAR

VARCHAR2

NUMBER

LONG

ROWID

UROWID

DATE

RAW

LONG RAW

MYSQL_TYPE_TINY

I/O

I/O

I/O

I

-

-

-

-

-

MYSQL_TYPE_SHORT

I/O

I/O

I/O

I

-

-

-

-

-

MYSQL_TYPE_LONG

I/O

I/O

I/O

I

-

-

-

-

-

MYSQL_TYPE_LONGLONG

I/O

I/O

I/O

I

-

-

-

-

-

MYSQL_TYPE_FLOAT

I/O

I/O

I/O

I

-

-

-

-

-

MYSQL_TYPE_DOUBLE

I/O

I/O

I/O

I

-

-

-

-

-

MYSQL_TYPE_DATE

I/O

I/O

-

I

-

-

I/O

-

-

MYSQL_TYPE_TIME

I/O

I/O

-

I

-

-

I/O

-

-

MYSQL_TYPE_DATETIME

I/O

I/O

-

I

-

-

I/O

-

-

MYSQL_TYPE_TIMESTAMP

I/O

I/O

-

I

-

-

I/O

-

-

MYSQL_TYPE_STRING

I/O

I/O

I/O

I/O

I/O

I/O

I/O

I/O

I/O

MYSQL_TYPE_VAR_STRING

O

O

O

O

O

O

O

O

O

MYSQL_TYPE_BLOB

I/O

I/O

-

I/O

-

-

-

I/O

I/O

MYSQL_TYPE_TINY_BLOB

O

O

-

O

-

-

-

O

O

MYSQL_TYPE_MEDIUM_BLOB

O

O

-

O

-

-

-

O

O

MYSQL_TYPE_LONG_BLOB

O

O

-

O

-

-

-

O

O

MYSQL_TYPE_NEWDECIMAL

O

O

O

-

-

-

-

-

-

MYSQL_TYPE_BLOB

- CHARおよびVARCHAR2: 変換は入力または出力に対して有効です。入力時には、列値は16進数の形式で格納されます。

- LONG: 変換は入力または出力に対して有効です。入力時には、列値は16進数の形式で格納されます。

- RAW: 変換は入力または出力に対して有効です。

- LONG RAW: 変換は入力または出力に対して有効です。

- NUMBER、ROWID、UROWIDおよびDATEでは、変換はサポートされていません。

MYSQL_TYPE_DATE

- CHARおよびVARCHAR2: 変換は入力または出力に対して有効です。入力時、ホスト文字列はOracle DATE文字形式であることが必要です。出力時、列値はOracle DATE形式で戻されます。

- DATE: 変換は入力または出力に対して有効です。

- LONG: 変換はデータベース列値への入力に対して有効です。

- NUMBER、ROWID、UROWID、RAWおよびLONG RAWでは、変換はサポートされていません。

MYSQL_TYPE_DATETIME

- CHARおよびVARCHAR2: 変換は入力または出力に対して有効です。入力時、ホスト文字列はOracle DATE文字形式であることが必要です。出力時、列値はOracle DATE形式で戻されます。

- DATE: 変換は入力または出力に対して有効です。

- LONG: 変換はデータベース列値への入力に対して有効です。

- NUMBER、ROWID、UROWID、RAWおよびLONG RAWでは、変換はサポートされていません。

MYSQL_TYPE_DOUBLE

- CHARおよびVARCHAR2: 変換は入力または出力に対して有効です。出力時、列値が有効な数値を表している必要があります。

- NUMBER: 変換は入力または出力に対して有効です。

- LONG: 変換はデータベース列値への入力に対して有効です。

- ROWID、UROWID、DATE、RAWおよびLONG RAWでは、変換はサポートされていません。

MYSQL_TYPE_FLOAT

- CHARおよびVARCHAR2: 変換は入力または出力に対して有効です。出力時、列値が有効な数値を表している必要があります。

- NUMBER: 変換は入力または出力に対して有効です。

- LONG: 変換はデータベース列値への入力に対して有効です。

- ROWID、UROWID、DATE、RAWおよびLONG RAWでは、変換はサポートされていません。

MYSQL_TYPE_LONG

- CHARおよびVARCHAR2: 変換は入力または出力に対して有効です。出力時、列値が有効な数値を表している必要があります。

- NUMBER: 変換は入力または出力に対して有効です。

- LONG: 変換はデータベース列値への入力に対して有効です。

- ROWID、UROWID、DATE、RAWおよびLONG RAWでは、変換はサポートされていません。

MYSQL_TYPE_LONG_BLOB

- CHAR、VARCHAR2、LONG、RAWおよびLONG RAW: 変換は出力に対して有効です。

- NUMBER、ROWID、UROWIDおよびDATEでは、変換はサポートされていません。

MYSQL_TYPE_LONGLONG

- CHARおよびVARCHAR2: 変換は入力または出力に対して有効です。出力時、列値が有効な数値を表している必要があります。

- NUMBER: 変換は入力または出力に対して有効です。

- LONG: 変換はデータベース列値への入力に対して有効です。

- ROWID、UROWID、DATE、RAWおよびLONG RAWでは、変換はサポートされていません。

MYSQL_TYPE_MEDIUM_BLOB

- CHAR、VARCHAR2、LONG、RAWおよびLONG RAW: 変換は出力に対して有効です。

- NUMBER、ROWID、UROWIDおよびDATEでは、変換はサポートされていません。

MYSQL_TYPE_NEWDECIMAL

- CHARおよびVARCHAR2: 変換は出力に対して有効です。列値は有効な数値を表している必要があります。

- NUMBER: 変換はCプログラム値への出力に対して有効です。

- LONG、ROWID、UROWID、DATE、RAWおよびLONG RAWでは、変換はサポートされていません。

MYSQL_TYPE_SHORT

- CHARおよびVARCHAR2: 変換は入力または出力に対して有効です。出力時、列値が有効な数値を表している必要があります。

- NUMBER: 変換は入力または出力に対して有効です。

- LONG: 変換はデータベース列値への入力に対して有効です。

- ROWID、UROWID、DATE、RAWおよびLONG RAWでは、変換はサポートされていません。

MYSQL_TYPE_STRING

- CHARおよびVARCHAR2: 変換は入力または出力に対して有効です。

- NUMBER: 変換は入力または出力に対して有効です。入力時、ホスト文字列は有効な数値を表している必要があります。

- LONG: 変換は入力または出力に対して有効です。

- ROWID: 変換は入力または出力に対して有効です。入力時、ホスト文字列はOracle ROWID形式であることが必要です。出力時、列値はOracle ROWID形式で戻されます。

- UROWID: 変換は入力または出力に対して有効です。入力時、ホスト文字列はOracle UROWID形式であることが必要です。出力時、列値はOracle UROWID形式で戻されます。

- DATE: 変換は入力または出力に対して有効です。入力時、ホスト文字列はOracle DATE文字形式であることが必要です。出力時、列値はOracle DATE形式で戻されます。

- RAW: 変換は入力または出力に対して有効です。入力時には、ホスト文字列を16進数の形式にする必要があります。

- LONG RAW: 変換は入力または出力に対して有効です。入力時には、ホスト文字列を16進数の形式にする必要があります。

MYSQL_TYPE_TIME

- CHARおよびVARCHAR2: 変換は入力または出力に対して有効です。入力時、ホスト文字列はOracle DATE文字形式であることが必要です。出力時、列値はOracle DATE形式で戻されます。

- DATE: 変換は入力または出力に対して有効です。

- LONG: 変換はデータベース列値への入力に対して有効です。

- NUMBER、ROWID、UROWID、RAWおよびLONG RAWでは、変換はサポートされていません。

MYSQL_TYPE_TIMESTAMP

- CHARおよびVARCHAR2: 変換は入力または出力に対して有効です。入力時、ホスト文字列はOracle DATE文字形式であることが必要です。出力時、列値はOracle DATE形式で戻されます。

- DATE: 変換は入力または出力に対して有効です。

- LONG: 変換はデータベース列値への入力に対して有効です。

- NUMBER、ROWID、UROWID、RAWおよびLONG RAWでは、変換はサポートされていません。

MYSQL_TYPE_TINY

- CHARおよびVARCHAR2: 変換は入力または出力に対して有効です。出力時、列値が有効な数値を表している必要があります。

- NUMBER: 変換は入力または出力に対して有効です。

- LONG: 変換はデータベース列値への入力に対して有効です。

- ROWID、UROWID、DATE、RAWおよびLONG RAWでは、変換はサポートされていません。

MYSQL_TYPE_TINY_BLOB

- CHAR、VARCHAR2、LONG、RAWおよびLONG RAW: 変換は出力に対して有効です。

- NUMBER、ROWID、UROWIDおよびDATEでは、変換はサポートされていません。

MYSQL_TYPE_VAR_STRING

- CHARおよびVARCHAR2: 変換はCプログラム値への出力に対して有効です。

- NUMBER: 変換はCプログラム値への出力に対して有効です。

- LONG: 変換はCプログラム値への出力に対して有効です。

- ROWID: 変換はCプログラム値への出力に対して有効です。出力時、列値はOracle ROWID形式で戻されます。

- UROWID: 変換はCプログラム値への出力に対して有効です。出力時、列値はOracle UROWID形式で戻されます。

- DATE: 変換はCプログラム値への出力に対して有効です。出力時、列値はOracle DATE形式で戻されます。

- RAW: 変換はCプログラム値への出力に対して有効です。

- LONG RAW: 変換はCプログラム値への出力に対して有効です。

MySQL外部データ型(LOBデータ型記述子)のデータ型変換

表7-3の外部データ型は、指定されたOracle内部データ型に変換されます。

表7-3 LOBデータ型記述子のデータ型変換

MySQL外部データ型

ORACLE INTERNAL CLOB/NCLOB

ORACLE INTERNAL BLOB

MYSQL_TYPE_BIT

I/O

I/O

MYSQL_TYPE_STRING

I/O

I/O

MYSQL_TYPE_VAR_STRING

O

O

MYSQL_TYPE_BLOB

I/O

I/O

MYSQL_TYPE_TINY_BLOB

O

O

MYSQL_TYPE_MEDIUM_BLOB

O

O

MYSQL_TYPE_LONG_BLOB

O

O

日時および時間隔データ型のデータ型変換

DATETIMEまたはINTERVAL列の操作時に、いずれかの文字データ型を使用して、FETCHまたはINSERT操作で使用するホスト変数を定義できます。ドライバにより、文字データ型とDATETIMEまたはINTERVALデータ型間の変換が自動的に行われます。

表7-4に、指定されたOracle内部データ型に変換される外部データ型を示します。

表7-4 日時データ型および内部データ型のデータ変換

外部/内部型

VARCHAR、CHAR

DATE

TS

TSTZ

TSLTZ

INTERVALYEARTOMONTH

INTERVALDAYTOSECOND

MYSQL_TYPE_STRING

I/O

I/O

I/O

I/O

I/O

I/O

I/O

MYSQL_TYPE_VAR_STRING

O

O

O

O

O

O

O

MYSQL_TYPE_DATE

I/O

I/O

I/O

I/O

I/O

-

-

MYSQL_TYPE_TIME

I/O

I/O

I/O

I/O

I/O

-

-

MYSQL_TYPE_DATETIME

I/O

I/O

I/O

I/O

I/O

-

-

MYSQL_TYPE_TIMESTAMP

I/O

I/O

I/O

I/O

I/O

-

-

エラー処理

OCIまたはOracleサーバーで生成されるすべてのエラーは、エラー後にmysql_errno()またはmysql_error()メソッドが呼び出されると、アプリケーションに渡されます。アプリケーションは、Oracle固有のエラーを受信します。Oracleエラー・メッセージは、MySQLエラー・コードよりもさらに具体的であるため、エラー状態の解決により適しています。

ドライバ自体で生成されるエラーは、OCIエラー空間でMySQLドライバに予約されるエラー範囲内にあります。

mysql_sqlstate()コールは、必要な場合は必ず、該当するSQLSTATEにエラーをマップしようとします。ほとんどの場合、一般的なエラー状態に相当するHY000を戻します。

SQLSTATEの可能な値は次のとおりです。

- 00000 成功

- HY000 その他すべてのエラー

ただし、これは、より詳細なSQLSTATEエラーを期待するクライアント・アプリケーションを部分的に書き換える必要があることも意味します。

使用可能なMySQL API

この項では、APIを機能別に分け、より詳細な情報へのリンクを示します。ただし、関数の動作やパラメータについて完全に説明するものではありません。

Oracle MySQLドライバはMySQL C APIのドキュメントに示されたAPIを実装しています。次のことに注意してください。

- 一部のMySQLファンクションで動作が変更されています。一般的に、相当する動作がOracleにないため、変更された動作について説明します。

- 一部のMySQLファンクションはサポートされていません。それに応じて説明でそれらを示しています。ドライバは、これらの関数についてエラーを返し、サポートされていない機能を回避するようにアプリケーションに求めます。

クライアント・ライブラリの初期化と終了

次のインタフェースでは、クライアント・ライブラリの初期化と終了がサポートされます。

- mysql_library_end()

- mysql_library_init()

- mysql_server_end()

- mysql_server_init()

接続管理

次のインタフェースでは、接続管理がサポートされます。

- my_init()

- mysql_change_user()

- mysql_close()

- mysql_connect()

- mysql_get_character_set_info()

- mysql_get_ssl_cipher()

- mysql_init()

- mysql_options()

- mysql_ping()

- mysql_real_connect()

- mysql_select_db()

- mysql_set_character_set()

- mysql_ssl_set()

エラー・レポート

次のインタフェースでは、エラー・レポートがサポートされます。

- mysql_errno()

- mysql_error()

- mysql_sqlstate()

文の構成と実行

次のインタフェースでは、文の構成と実行がサポートされます。

- mysql_affected_rows()

- mysql_escape_string()

- mysql_hex_string()

- mysql_kill()

- mysql_query()

- mysql_real_escape_string()

- mysql_real_query()

- mysql_reload()

結果セットの処理

次のインタフェースでは、結果セットの処理がサポートされます。

- mysql_data_seek()

- mysql_eof()

- mysql_fetch_field()

- mysql_fetch_field_direct()

- mysql_fetch_fields()

- mysql_fetch_lengths()

- mysql_fetch_row()

- mysql_field_count()

- mysql_field_seek()

- mysql_field_tell()

- mysql_free_result()

- mysql_insert_id()

- mysql_list_dbs()

- mysql_list_fields()

- mysql_list_processes()

- mysql_list_tables()

- mysql_more_results()

- mysql_next_result()

- mysql_num_fields()

- mysql_num_rows()

- mysql_row_seek()

- mysql_row_tell()

- mysql_store_result()

- mysql_use_result()

準備された文

次のインタフェースでは、文の準備がサポートされます。

- mysql_stmt_affected_rows()

- mysql_stmt_attr_get()

- mysql_stmt_attr_set()

- mysql_stmt_bind_param()

- mysql_stmt_bind_result()

- mysql_stmt_close()

- mysql_stmt_data_seek()

- mysql_stmt_errno()

- mysql_stmt_error()

- mysql_stmt_execute()

- mysql_stmt_fetch()

- mysql_stmt_fetch_column()

- mysql_stmt_field_count()

- mysql_stmt_free_result()

- mysql_stmt_init()

- mysql_stmt_insert_id()

- mysql_stmt_next_result()

- mysql_stmt_num_rows()

- mysql_stmt_param_count()

- mysql_stmt_param_metadata()

- mysql_stmt_prepare()

- mysql_stmt_reset()

- mysql_stmt_result_metadata()

- mysql_stmt_row_seek()

- mysql_stmt_row_tell()

- mysql_stmt_send_long_data()

- mysql_stmt_sqlstate()

- mysql_stmt_store_result()

トランザクション制御

次のインタフェースでは、トランザクション制御がサポートされます。

- mysql_autocommit()

- mysql_commit()

- mysql_rollback()

情報ルーチン

次のインタフェースでは、情報ルーチンがサポートされます。

- mysql_character_set_name()

- mysql_get_client_info()

- mysql_get_client_version()

- mysql_get_host_info()

- mysql_get_proto_info()

- mysql_get_server_info()

- mysql_get_server_version()

- mysql_info()

- mysql_stat()

- mysql_thread_id()

- mysql_warning_count()

管理ルーチン

次のインタフェースでは、管理ルーチンがサポートされます。

- mysql_refresh()

- mysql_set_server_option()

- mysql_set_local_infile_default()

- mysql_set_local_infile_handler()

- mysql_shutdown()

その他のルーチン

次のインタフェースでは、残りのすべてのルーチンがサポートされます。

- mysql_create_db()

- mysql_debug()

- mysql_debug_info()

- mysql_drop_db()

- mysql_dump_debug_info()

- mysql_read_query_result()

- mysql_send_query()

- mysql_thread_end()

- mysql_thread_init()

- mysql_thread_safe()

my_init()

この関数は無演算関数です。my_sys.hファイルのmy_initマクロによって呼び出されます。すべての初期化はmysql_library_init()によって行われます。

戻り値

0

mysql_affected_rows()

実行されたINSERT、UPDATEおよびDELETE文で処理された行の数を返します。

UPDATE文の場合、MySQLのセマンティクスでは、新しい値と以前の値が同じ行は報告されないことに注意してください。これに対して、Oracleは、新しい値と以前の値が同じ場合でも、その行は影響を受けたと報告します。この関数は、Oracleのセマンティクスを実装します。そのため、このコールに依存する既存のアプリケーションで、プログラムの変更が必要になる可能性があります。

SELECT文の場合、戻り値は(my_ulonglong) -1です。

戻り値

DML文によって処理された行数で、>0です。0は文による更新が行われなかったことを示します。-1は文が問合せ(SELECT)またはエラーだったことを示します。

mysql_autocommit()

自動コミット・モードをONまたはOFFに設定します。

戻り値

自動コミット・モードが正常に変更された場合、0。プロセスでエラーが発生した場合、0以外。

mysql_change_user()

ユーザー名、パスワードおよび同じまたは別のホスト上のデータベースを含む、ユーザーを変更します。Oracle Database 12cリリース1では、データベースの変更はサポートされていないので、dbパラメータに入力された値は無視されます。

mysql_change_user()へのコールにより、アクティブ・トランザクションはロール・バックされ、現在のセッションは終了し、hostパラメータに格納された情報に基づいて新しい接続が再確立されます。

Oracle Database 12cリリース1でこの動作を実装するには、既存のアプリケーションのアプリケーション・ロジックを必要に応じて変更する必要があります。

戻り値

元のホストで指定されたユーザー名とパスワードに対応する接続が再確立できた場合、0。エラーが発生した場合、0以外。

mysql_character_set_name()

Oracle Database 12cリリース1ではサポートされません。このコールの結果に依存するアプリケーションは、そのアプリケーション・ロジックを変更する必要があります。

戻り値

空の文字列

mysql_close()

接続を閉じ、関連するすべてのデータ構造を解放します。

戻り値

なし

mysql_commit()

サービス・コンテキストに現在関連付けられているトランザクションをコミットします。

mysql_commit()コールはOracle Database 12cリリース1でのデフォルト・モードをサポートしています。そのため、completion typeシステム変数は無視されます。

このAPIを使用してMySQL固有のcompletion type操作を実行する既存のアプリケーションは、そのアプリケーション・ロジックを変更する必要があります。

戻り値

成功した場合、0。それ以外は、0以外。

mysql_connect()

非推奨。mysql_real_connect()を使用してください。

戻り値

初期化されたMYSQL構造。エラーが発生した場合、NULL。

mysql_create_db()

Oracle Database 12cリリース1ではサポートされません。このコールの結果に依存するアプリケーションは、そのアプリケーション・ロジックを変更する必要があります。

戻り値

成功した場合、0。無効なMYSQL構造が渡された場合、0以外。

mysql_data_seek()

オフセット・パラメータで指定された値に基づいて結果セットの行にシークします。

オフセット値は行番号ですが、0からmysql_num_rows(result) -1までです。

戻り値

なし

mysql_debug()

Oracle Database 12cリリース1ではサポートされません。このコールの結果に依存するアプリケーションは、そのアプリケーション・ロジックを変更する必要があります。

mysql_debug_info()

Oracle Database 12cリリース1ではサポートされません。このコールの結果に依存するアプリケーションは、そのアプリケーション・ロジックを変更する必要があります。

戻り値

成功した場合、0。無効なMYSQL構造の場合、0以外。

mysql_drop_db()

Oracle Database 12cリリース1ではサポートされません。このコールの結果に依存するアプリケーションは、そのアプリケーション・ロジックを変更する必要があります。

戻り値

成功した場合、0。無効なMYSQL構造の場合、0以外。

mysql_dump_debug_info()

Oracle Database 12cリリース1ではサポートされません。このコールの結果に依存するアプリケーションは、そのアプリケーション・ロジックを変更する必要があります。

戻り値

成功した場合、0。無効なMYSQL構造が渡された場合、0以外。

mysql_eof()

非推奨。かわりに、mysql_errno()またはmysql_error()を使用してください。

結果セットの最終行が読み取られたかどうかを判別します。

戻り値

最終行がフェッチされた場合は1、それ以外の場合は0。

mysql_errno()

接続またはグローバル・コンテキストでの直前のエラーのOracleエラー番号を返します。

前のコールで接続が確立されていない場合、NULLを渡し、グローバル・コンテキストでの直前のエラー番号を戻します。

戻り値

MYSQL接続での直前のエラー番号、またはグローバル・コンテキストでの直前のエラー番号。

mysql_error()

接続またはグローバル・コンテキストでの直前のエラーのOracleエラー・メッセージを返します。

前のコールで接続が確立されていない場合、NULLを渡し、グローバル・コンテキストでの直前のエラー・メッセージを戻します。

戻り値

MYSQL接続での直前のエラー・メッセージ、またはグローバル・コンテキストでの直前のエラー・メッセージ。

mysql_escape_string()

ソース(fromパラメータ)の文字列をエンコードし、宛先(toパラメータ)に格納して、終端のNULLを付加します。

接続での現在のキャラクタ・セットを使用して、1文字('\')のみのエンコードをサポートします。

mysql_real_escape_string()を参照してください。

戻り値

toに格納された、終端のNULLを除く値の長さ。

mysql_fetch_field()

結果セットの1つの列の定義をMYSQL_FIELD構造として返します。

MYSQL_FIELD構造の、flag、name、name_length、org_name、org_name_length、typeおよびmax_length属性のみをサポートします。

- flag属性は、NOT_NULL_FLAG、NUM_FLAG、およびBINARY_FLAGの値のみをサポートします。

- org_name属性には、name属性と同じ値が設定されます。

- org_name_length属性には、name_length属性と同じ値が設定されます。

戻り値

現在の列のMYSQL_FIELD構造。列が残っていない場合、NULL。

mysql_fetch_field_direct()

指定されたフィールド番号に対する列のフィールド定義を、MYSQL_FIELD構造として取得します。

戻り値

特定のフィールドのフィールド定義。エラーが発生した場合またはフィールド番号fieldnrが範囲外の場合、NULL。

mysql_fetch_fields()

結果セットに対するすべてのMYSQL_FIELD構造の配列を返します。各MYSQL_FIELD構造は、結果セットの1つの列のフィールド定義です。

戻り値

エラーが発生した場合、NULL。

mysql_fetch_lengths()

現在の行の列の長さの配列を返します。

戻り値

各列のサイズを表す符号なし長整数の配列。エラーが発生した場合、NULL。

mysql_fetch_row()

結果セットの次の行を取得します。

戻り値

次の行のMYSQL_ROW構造。取得する行がそれ以上ない場合、またはエラーが発生した場合、NULL。

mysql_field_count()

接続での最新の問合せの結果セット内の列数を返します。

戻り値

MYSQL構造内の結果セットのフィールド数。エラーが発生した場合、0。

mysql_field_seek()

フィールド・カーソルを指定されたオフセットに設定します。

戻り値

フィールド・セットへのオフセット

mysql_field_tell()

フィールド(現在のフィールド)の位置を返します。

戻り値

現在のフィールドのオフセット

mysql_free_result()

結果セットに割り当てられているメモリーを解放します。

戻り値

なし

mysql_get_character_set_info()

Oracle Database 12cリリース1ではサポートされません。このコールの結果に依存するアプリケーションは、そのアプリケーション・ロジックを変更する必要があります。

戻り値

なし

mysql_get_client_info()

mysql_version.hヘッダー・ファイルにMYSQL_SERVER_VERSIONマクロによって定義されているMySQLバージョン番号を文字列形式で返します。マクロ定義はoramysqlライブラリをビルドするmysql_version.hファイルに使用されます。アプリケーションによって使用されるmysql_version.hファイルではありません。

戻り値

MySQLクライアント・ライブラリ・バージョンを表す文字列。

mysql_get_client_version()

mysql_version.hヘッダー・ファイルにMYSQL_VEERSION_IDマクロによって定義されている現在のMySQLバージョンを返します。マクロ定義はoramysqlライブラリをビルドするmysql_version.hファイルに使用されます。アプリケーションによって使用されるmysql_version.hファイルではありません。

戻り値

MYSQL_VERSION_IDマクロに格納されているMySQLのバージョンを表す符号なし長整数。マクロ定義はoramysqlライブラリをビルドするmysql_version.hファイルに使用されます。アプリケーションによって使用されるmysql_version.hファイルではありません。

mysql_get_host_info()

データベースに接続するために使用されたホスト名を戻します。

戻り値

ホスト名の文字列。エラーの場合、NULL。

mysql_get_proto_info()

これはOracle環境ではno-opです。このコールの結果に依存するアプリケーションは、そのアプリケーション・ロジックを変更する必要があります。

戻り値

0

mysql_get_server_info()

Oracleサーバーのバージョンをテキスト文字列形式で戻します(「12.1.0.1.0」など)。

このコールの結果に依存するアプリケーションは、そのアプリケーション・ロジックを変更する必要があります。

戻り値

Oracleサーバー番号を表す文字列。エラーが発生した場合、NULL。

mysql_get_server_version()

Oracle Databaseのバージョン番号(120100など)を戻します。これは、整数XXYYZZ形式です。XXはメジャー・バージョン、YYはマイナー・バージョン、ZZは、リリース・レベル内のバージョンを表します。

戻り値

Oracle Databaseバージョン番号。エラーが発生した場合、0。

mysql_get_ssl_cipher()

これは無演算APIです。このコールの結果に依存するアプリケーションは、そのアプリケーション・ロジックを変更する必要があります。

戻り値

NULL

mysql_hex_string()

fromパラメータで指定したた文字列を16進形式にエンコードします。各文字が2桁の16進数としてエンコードされます。結果はtoパラメータに格納され、終端にNULLバイトを含みます。

toバッファは、最低でもlength*2+1バイトのサイズが必要です。

戻り値

toパラメータに格納された、終端のNULL文字を除く値の長さ。

mysql_info()

これは無演算APIです。このコールの結果に依存するアプリケーションは、そのアプリケーション・ロジックを変更する必要があります。

戻り値

NULL

mysql_init()

NULLが渡された場合、MYSQL構造を割り当てます。それ以外の場合、このコールは、渡されたMYSQL構造を初期化します。

戻り値

初期化されたMYSQL構造。MYSQL構造を割り当てられない場合、または初期化できない場合、NULL。

mysql_insert_id()

これは無演算APIです。このコールの結果に依存するアプリケーションは、そのアプリケーション・ロジックを変更する必要があります。

戻り値

0

mysql_kill()

これは無演算APIです。このコールの結果に依存するアプリケーションは、そのアプリケーション・ロジックを変更する必要があります。

戻り値

0。無効なMYSQL構造が渡された場合、0以外。

mysql_library_end()

oramysqlライブラリを終了します。

戻り値

なし

mysql_library_init()

oramysqlライブラリを初期化します。

戻り値

成功した場合、0。MySQLライブラリの初期化に失敗した場合、0以外。

mysql_list_dbs()

wildパラメータに合致するサーバー上のデータベース名のリストを返します。

このAPIを使用するには、DBAがoramysql_dbs_viewビューを作成し、PUBLICに権限を付与します。

Oracle Database 12cの場合

Oracle Database 12cリリース1の場合、ビューoramysql_dbs_viewはV$DATABASEおよびV$PDBSシステム・オブジェクトに基づきます。

Oracle Database 12c以降のバージョンに接続するときは、次のSQLスクリプトを使用して、Oracle Database 12cにoramysql_dbs_viewビューを作成します。

create view oramysql_dbs_view(name) as select left.name from v$pdbs left
union select right.name from v$database right;
create public synonym oramysql_dbs_view for oramysql_dbs_view;
grant select on oramysql_dbs_view to public;

アプリケーションがmysql_list_dbs()関数を呼び出したときにoramysql_dbs_viewビューが存在しない場合、V$ PDBS表およびV$ DATABASE表から情報が取得されます。ただし、これらの表にアクセスする権限がない場合、エラーが生成されます。

Oracle Database 12cより前のOracle Databaseの場合

次のSQLスクリプトを使用して、Oracle Databaseにoramysql_dbs_viewビューを作成します。

create view oramysql_dbs_view(name) as select name form v$database;
create public synonym oramysql_dbs_view for oramysql_dbs_view;
grant select on oramysql_dbs_view to public;

ビューが存在しない場合、wildパラメータは無視され、コールによって次のSQL文が実行されます。

select SYS_CONTEXT( 'USERENV', 'DB_NAME') from DUAL;

戻り値

エラーが発生した場合、NULL。成功した場合、MYSQL_RES結果セット。

mysql_list_fields()

指定した表に対し、wildパラメータに合致する列名を返します。

戻り値

エラーが発生した場合、NULL。成功した場合、MySql結果セット。

mysql_list_processes()

これは無演算APIです。このコールの結果に依存するアプリケーションは、そのアプリケーション・ロジックを変更する必要があります。

戻り値

NULL

mysql_list_tables()

これは無演算関数です。このコールの結果に依存するアプリケーションは、そのアプリケーション・ロジックを変更する必要があります。

戻り値

NULL

mysql_more_results()

現在実行している文から、さらに結果を取得できるかどうかを確認します。

戻り値

さらに結果がある場合、TRUE。結果セットがそれ以上ない場合、FALSE。

mysql_next_result()

次の結果セットを取得します。

戻り値

成功し、さらに結果がある場合、0。成功し、それ以上結果がない場合、-1。エラーが発生した場合、>0。

mysql_num_fields()

結果セット内の列の数を返します。

戻り値

結果セット内の列の数を表す符号なしの整数。失敗した場合、0を返します。

mysql_num_rows()

結果セット内の行の数を返します。

戻り値

結果セット内の行の数。それ以外の場合、0。

mysql_options()

これは無演算関数です。このコールの結果に依存するアプリケーションは、そのアプリケーション・ロジックを変更する必要があります。

戻り値

成功した場合、0。無効なMYSQL構造が渡された場合、0以外。

mysql_ping()

サーバーにアクセスできない場合、エラーと接続失敗の詳細を返します。

戻り値

成功した場合、0。エラーが発生した場合、0以外。

mysql_query()

null終端の文字列で示されたSQL文を実行します。

戻り値

成功した場合、0。エラーが発生した場合、0以外。

mysql_read_query_result()

これは無演算関数です。コールが完了するとmysql_send_query()からの問合せ結果が使用可能になります。

戻り値

0

mysql_real_connect()

dbパラメータはOracle Database 12cリリース1では使用されません。このパラメータを使用してdbに接続する既存のアプリケーションは、hostパラメータに接続識別子またはサービス名を指定する必要があります。接続文字列は次の形式で指定します。

[//]host[:port][/service_name][:server][/instance_name]

たとえば、SIDがorcl3のホストca-tools3.us.oracle.comに接続する場合、ホスト・パラメータはca-tools3.us.oracle.com/orcl3です。

パラメータdb、port、unix_socketおよびclient_flagは使用されていません。ポートを指定する必要がある場合、hostパラメータに使用される構文である必要があります。

戻り値

成功した場合、MYSQL構造が初期化されます。初期化に成功しなかった場合、NULL。

mysql_real_escape_string()

ソース(fromパラメータ)の文字列をエンコードし、結果を宛先(toパラメータ)に格納して終端のnullバイトを付加します。

一重引用符で囲まれた文字のみがエスケープされることに注意してください。各一重引用符はOracleのセマンティクスを使用してエスケープされます。toバッファは、最低でもlength*2+1バイトのサイズが必要です。元の文字列の各一重引用符は、2つの連続した一重引用符に置換されます。

mysql_escape_string()を参照してください。

戻り値

toバッファに格納された、終端のNULLを除く値の長さ。それ以外の場合は0。

mysql_real_query()

この関数は、問合せ文字列を実行します。

戻り値

成功した場合、0。エラーが発生した場合、0以外。

mysql_refresh()

これは無演算APIです。このコールの結果に依存するアプリケーションは、そのアプリケーション・ロジックを変更する必要があります。

戻り値

成功した場合、0。無効なMySQL構造が渡された場合、0以外。

mysql_reload()

権限表を再ロードします。この関数は非推奨で、実装されていません。かわりにmysql_query()を使用します。このコールの結果に依存するアプリケーションは、そのアプリケーション・ロジックを変更する必要があります。

mysql_rollback()

現在のトランザクション(最後のmysql_commit()またはmysql_real_connect()コール以降に実行された一連の文として定義される)がロールバックされます。アプリケーションがオブジェクト・モードで実行されている場合は、このトランザクションで修正または更新されたオブジェクト・キャッシュ内のオブジェクトも同様にロールバックされます。

mysql_rollback()コールはOracle Database 12cリリース1でのデフォルト・モードをサポートしています。そのため、completion typeシステム変数は無視されます。

このAPIを使用してMySQL固有のcompletion type操作を実行する既存のアプリケーションは、そのアプリケーション・ロジックを変更する必要があります。

戻り値

現在アクティブではないグローバル・トランザクションをロールバックしようとするとエラーになります。

mysql_row_seek()

特定の行に設定し、前の行とのオフセットを返します。

戻り値

MYSQL_ROW_OFFSET構造での前の行とのオフセット。

mysql_row_tell()

結果セット内の現在の行の位置を返します。

戻り値

MYSQL_ROW_OFFSET構造での現在の行のオフセット。エラーが発生した場合、NULL。

mysql_select_db()

これは無演算APIです。このコールの結果に依存するアプリケーションは、そのアプリケーション・ロジックを変更する必要があります。

戻り値

0

mysql_send_query()

問合せを送信します。oramysqlライブラリでは、この関数は非同期ではありません。問合せが実行されるまで呼出しはブロッキングされます。

戻り値

成功した場合、0。エラーが発生した場合、0以外。

mysql_server_end()

oramysqlライブラリを終了してクリーンアップします。

戻り値

なし

mysql_server_init()

接続を作成する前にoramysqlクライアント・ライブラリを初期化します。mysql.hヘッダー・ファイルで、関数mysql_library_init()マクロはmysql_server_init()であると定義されています。この呼出しはスレッドセーフではありません。呼び出すことができるのは、1つのスレッドのみです。

戻り値

成功した場合、0。エラーが発生した場合、0以外。

mysql_set_character_set()

これは無演算APIです。このコールの結果に依存するアプリケーションは、そのアプリケーション・ロジックを変更する必要があります。

戻り値

0

mysql_set_local_infile_default()

これは無演算APIです。このコールの結果に依存するアプリケーションは、そのアプリケーション・ロジックを変更する必要があります。

戻り値

0

mysql_set_local_infile_handler()

これは無演算APIです。このコールの結果に依存するアプリケーションは、そのアプリケーション・ロジックを変更する必要があります。

戻り値

0

mysql_set_server_option()

これは無演算APIです。このコールの結果に依存するアプリケーションは、そのアプリケーション・ロジックを変更する必要があります。

戻り値

0

mysql_shutdown()

Oracle Databaseインスタンスの停止に役立ちます。mysql_shutdown APIを使用する前に、CプログラムはSYSDBAまたはSYSOPERセッションでサーバーに接続する必要があります。

パラメータmysql_shutdown_levelおよびmysql_enum_shutdown_levelは無視されます。内部では、OCIDBShutdown()コールがOCI_DEFAULTモードで実行されます。

戻り値

成功した場合、0。エラーが発生した場合、0以外。

mysql_sqlstate()

null終端でないSQLSTATE文字列を返します。MySQLには、使用されていないSQLSTATEコードが多くあります。

戻り値

SQLSTATEコード: 00000 - 成功、HY000 - その他のすべてのエラー。

mysql_ssl_set()

これは無演算APIです。このコールの結果に依存するアプリケーションは、そのアプリケーション・ロジックを変更する必要があります。

戻り値

成功した場合、0。無効なMySQL構造が渡された場合、0以外。

mysql_stat()

これは無演算APIです。このコールの結果に依存するアプリケーションは、そのアプリケーション・ロジックを変更する必要があります。

戻り値

成功した場合、空白(" ")4つの文字列。無効なMYSQL構造が渡された場合、NULL。

mysql_stmt_affected_rows()

この関数は、準備された文の実行によって影響を受ける行の数を返します。

戻り値

成功した場合、DML操作により影響を受ける行の数。エラーが発生した場合、またはSELECT文が実行された場合、(my_ulonglong)-1。

mysql_stmt_attr_get()

これは無演算APIです。このコールの結果に依存するアプリケーションは、そのアプリケーション・ロジックを変更する必要があります。

戻り値

0

mysql_stmt_attr_set()

これは無演算APIです。このコールの結果に依存するアプリケーションは、そのアプリケーション・ロジックを変更する必要があります。

戻り値

0

mysql_stmt_bind_param()

この関数は、準備された文内のすべてのパラメータをバインドします。

戻り値

パラメータが正常にバウンドされた場合、0。エラーが発生した場合、0以外。

mysql_stmt_bind_result()

準備された文のすべてのSELECTでリストされた列のプログラム変数をバインドします。

戻り値

成功した場合、0。エラーが発生した場合、0以外。

mysql_stmt_close()

MYSQL_STMTオブジェクトを閉じます。

戻り値

0

mysql_stmt_data_seek()

この関数は、特定の行のデータを取得しようとします。

戻り値

なし

mysql_stmt_errno()

MYSQL_STMTオブジェクトで発生した直前のエラーのエラー番号を返します。

戻り値

なし

mysql_stmt_error()

この関数は、MYSQL_STMTオブジェクトで発生した直前のエラーのエラー・メッセージを返します。

戻り値

const *charエラー・メッセージ。

mysql_stmt_execute()

この関数は、準備された文を実行します。

戻り値

文が正常に実行された場合、0。エラーが発生した場合、0以外。

mysql_stmt_fetch()

この関数は、mysql_stmt_bind_resultの呼出しによってバインドされたプログラム変数内の1つの行をフェッチします。

戻り値

1つの行が正常にフェッチされた場合、0。それ以上行/データがない場合、MYSQL_NO_DATA。データの切捨てが発生した場合、MYSQL_DATA_TRUNCATED。エラーが発生した場合、1。

mysql_stmt_fetch_column()

この関数は、現在の結果セットの行から1列をフェッチします。

戻り値

値が正常にフェッチされた場合、0。エラーが発生した場合、0以外。

mysql_stmt_field_count()

MYSQL_STMTオブジェクト内のフィールドの数をフェッチします。

戻り値

エラーが発生した場合、0。それ以外の場合、MYSQL_STMTオブジェクトに関連付けられた結果セットのフィールド数。

mysql_stmt_free_result()

MYSQL_STMTオブジェクトに関連付けられた結果セットを解放します。

戻り値

0

mysql_stmt_init()

MYSQL接続オブジェクトから新しいMYSQL_STMTオブジェクトを作成します。

戻り値

成功した場合、MYSQL_STMTオブジェクト。エラーが発生した場合、NULL。

mysql_stmt_insert_id()

これは無演算APIです。このコールの結果に依存するアプリケーションは、そのアプリケーション・ロジックを変更する必要があります。

戻り値

0

mysql_stmt_next_result()

この関数は、実装されていません。このコールの結果に依存するアプリケーションは、そのアプリケーション・ロジックを変更する必要があります。

戻り値

0

mysql_stmt_num_rows()

格納されている結果セット内の行の数を返します。格納されていない(バッファリングされていない結果セット)場合、それまでにフェッチされた行の総数を返します。

戻り値

行の数のフェッチ中にエラーが発生した場合、0。

mysql_stmt_param_count()

準備された文内のバインド・パラメータの数を返します。

戻り値

バインド・パラメータの数を返す際にエラーが発生した場合、0。

mysql_stmt_param_metadata()

この関数は、MySql結果セット(MYSQL_RES *) NULLへのキャストです。

戻り値

NULL

mysql_stmt_prepare()

MYSQL_STMT内の文の実行を準備します。

戻り値

成功した場合、0。エラーが発生した場合、0以外。

mysql_stmt_reset()

MYSQL_STMT内の準備された文をリセットします。

戻り値

0

mysql_stmt_result_metadata()

MYSQL_STMTオブジェクトを介して実行されるSELECT文の結果のメタデータを返します。

戻り値

準備されたSELECT文のメタデータを表す結果セット。エラーが発生した場合、NULL。

mysql_stmt_row_seek()

行の位置を探し、前の行とのオフセットを返します。

戻り値

MYSQL_ROW_OFFSET構造内の前の行とのオフセット。

mysql_stmt_row_tell()

結果セット内の現在の行の位置を返します。

戻り値

現在の行の位置。エラーが発生した場合、NULL。

mysql_stmt_send_long_data()

パラメータ・データを分割してサーバーに送信します。

関数mysql_stmt_bind_param()が最初にコールされ、次にmysql_stmt_send_long_data()、mysql_stmt_execute()と続く必要があります。

この関数は、列の文字データ値またはバイナリ・データ値を分割して送信するために複数回呼び出すことができます。

戻り値

データがサーバーに正常に送信された場合、0。エラーが発生した場合、0以外。

mysql_stmt_sqlstate()

最新の準備された文に対するSQLSTATE文字列を返します。MySQLには、使用されていないSQLSTATEコードが多くあります。

戻り値

SQLSTATEコード: 「00000」 - 成功、「HY0000」 - その他のすべてのエラー。

mysql_stmt_store_result()

直前の問合せからの結果セットを格納します。

直前の問合せがSELECTだった場合、結果セットが返されます。直前の文がSELECT以外またはエラーだった場合、NULL結果セットが返されます。

戻り値

成功した場合、有効な結果セット。エラーが発生した場合、またはSELECT以外の文の場合、NULL。

mysql_store_result()

直前の問合せからの結果セットを格納します。

直前の問合せがSELECTだった場合、結果セットを返します。

直前の文がSELECT以外またはエラーだった場合、NULL結果セットが返されます。

戻り値

成功した場合、有効な結果セット。それ以外の、エラーまたはSELECT以外の文の場合、NULL。

mysql_thread_end()

これは無演算APIです。このコールの結果に依存するアプリケーションは、そのアプリケーション・ロジックを変更する必要があります。

戻り値

なし

mysql_thread_id()

接続のOracleセッションID(SID)を返します。これは、内部で次のSQL文を実行して取得したものです。

select SYS_CONTEXT('USERENV', 'SID') from DUAL;

このコールの結果に依存するアプリケーションは、そのアプリケーション・ロジックを変更する必要があります。

戻り値

OracleセッションID(SID)。エラーが発生した場合、0。

mysql_thread_init()

これは無演算APIです。このコールの結果に依存するアプリケーションは、そのアプリケーション・ロジックを変更する必要があります。

戻り値

0

mysql_thread_safe()

oramysqlライブラリはスレッドセーフであるため、この関数は常にTRUEを返します。

戻り値

TRUE

mysql_use_result()

結果セットの取得を開始します。

戻り値

エラーが発生した場合、NULL。成功した場合、有効な結果セット。

mysql_warning_count()

これは無演算APIです。このコールの結果に依存するアプリケーションは、そのアプリケーション・ロジックを変更する必要があります。

戻り値

成功した場合、0。エラーが発生した場合、0以外。

8 JDBCアプリケーションのSQL翻訳のAPIリファレンス

これらのAPIは、oracle.jdbcパッケージの一部になります。この章では、SQL翻訳に固有のoracle.jdbcの要素についてのみ説明します。

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

- 翻訳プロパティ

- OracleTranslatingConnectionインタフェース

- エラー翻訳構成ファイル

関連項目:

- Oracle Database JDBC Java APIリファレンスのoracle.jdbcパッケージのドキュメント一式

翻訳プロパティ

表8-1に、翻訳プロパティを示します。

表8-1 翻訳プロパティ

プロパティ

説明

sqlTranslationProfile

翻訳プロファイルの名前を指定します。

sqlErrorTranslationFile

SQLエラー翻訳ファイルのパスを指定します。

sqlTranslationProfile

プロパティoracle.jdbc.sqlTranslationProfileは、翻訳プロファイルの名前を指定します。

宣言

oracle.jdbc.sqlTranslationProfile

定数

OracleConnection.CONNECTION_PROPERTY_SQL_TRANSLATON_PROFILE

定数の値は、oracle.jdbc.sqlTranslationProfileです。これは、プロパティ名でもあります。

プロパティ値

値は文字列です。デフォルト値はありません。

備考

プロパティsqlTranslationProfileは、システム・プロパティまたは接続プロパティのいずれかとして設定できます。SQL翻訳を使用するには、このプロパティが必要です。このプロパティを設定する場合、その他で特に指定しないかぎり、接続で作成されるすべての文でSQL翻訳が有効になります。

sqlErrorTranslationFile

プロパティoracle.jdbc.sqlErrorTranslationFileは、SQLエラー翻訳ファイルのパスを指定します。

宣言

oracle.jdbc.sqlErrorTranslationFile

定数

Oracle.connection.CONNECTION_PROPERTY_SQL_ERROR_TRANSLATION_FILE.

プロパティ値

値はパス名です。デフォルト値はありません。

例外

接続を確立する際のエラーによって、SQLExceptionが生じますが、有効な接続はありません。ただし、SQLエラー翻訳ファイルのパスは、システム・プロパティまたは接続プロパティのいずれかとして利用でき、エラーの翻訳に使用されます。

備考

このファイルは、接続の確立が失敗したときに生じるエラーの翻訳にのみ使用されます。接続が確立すると、このファイルは無視され、接続の確立後に生じるエラーの翻訳の詳細が含まれる場合でも考慮されません。プロパティsqlErrorTranslationFileは、システム・プロパティまたは接続プロパティのいずれかとして設定できます。このファイルのコンテンツは、有効な接続がない場合に、Oracle SQLExceptionsを外部SQLExceptionsに翻訳する際に使用されます。

OracleTranslatingConnectionインタフェース

このインタフェースは、SQL翻訳をサポートするConnectionオブジェクトによってのみ実装されます。このインタフェースの主な目的は、翻訳接続から非翻訳文(preparedStatementおよびCallableStatementを含む)を取得することです。

publicインタフェースoracle.jdbc.OracleTranslatingConnectionは、翻訳および非翻訳Statementオブジェクトを作成するためのファクトリ・メソッドを定義します。

表8-2に、OracleTranslatingConnection列挙を示します。

表8-2 OracleTranslatingConnectionの列挙

名前

説明

SqlTranslationVersion

マップのキーを提供します。

表8-3に、OracleTranslatingConnectionメソッドを示します。

表8-3 OracleTranslatingConnectionメソッド

名前

説明

createStatement()

SQLを翻訳するオプションまたは翻訳しないオプションを指定してStatementオブジェクトを作成します。

prepareCall()

SQLを翻訳するオプションまたは翻訳しないオプションを指定してCallableStatementオブジェクトを作成します。

prepareStatement()

SQLを翻訳するオプションまたは翻訳しないオプションを指定してPreparedStatementオブジェクトを作成します。

getSQLTranslationVersions()

SQL翻訳時に問合せのすべての翻訳バージョンのマップを戻します。

SqlTranslationVersion

SqlTranslationVersion列挙値は、getSQLTranslationVersions()メソッドのキーを指定します。

構文

public enum SqlTranslationVersion {
ORIGINAL_SQL,
JDBC_MARKER_CONVERTED,
TRANSLATED
}

次の表では、SqlTranslationVersionのすべての列挙値と、それぞれの列挙値の説明を示します。

メンバー名

説明

ORIGINAL_SQL

元のベンダーに固有のSQLを指定します。

JDBC_MARKER_CONVERTED

JDBCパラメータ・マーカー('?')がOracleスタイルのパラメータ・マーカー(':b<n>')で置き換えられるように指定します。このため、連続する'?'は、:b1、:b2、:b3のように変換されます。この変更は、翻訳時にパラメータの順序で変更を処理する場合に必要です。このバージョンは、サーバーに送信され、翻訳されます。このため、サーバー上のカスタム翻訳は、ORIGINAL_SQLバージョンではなくこのバージョンから登録する必要があります。

TRANSLATED

サーバーから戻される翻訳済問合せを指定します。

createStatement()

このグループのメソッドは、Statementオブジェクトを作成し、文がSQL翻訳をサポートするかどうかを指定します。パラメータtranslatingの値がTRUEの場合、返される文は翻訳をサポートし、translating引数を指定しないjava.sql.Connectionインタフェースの対応するバージョンと同一です。値がFALSEの場合、戻り文は翻訳をサポートしません。

構文

説明

public Statement createStatement(
boolean translating)
throws SQLException;

SQLを翻訳するオプションまたは翻訳しないオプションを指定してStatementオブジェクトを作成します。

public Statement createStatement(
int resultSetType,  int resultSetConcurrency,  boolean translating)
throws SQLException;

SQLを翻訳するオプションまたは翻訳しないオプションを指定して、指定のタイプと同時性でStatementオブジェクトを作成します。

public Statement createStatement(
int resultSetType,
int resultSetConcurrency,
int resultSetHoldability,
boolean translating)
throws SQLException;

SQLを翻訳するオプションまたは翻訳しないオプションを指定して、指定のタイプ、同時性および持続性でStatementオブジェクトを作成します。

パラメータ

パラメータ

説明

resultSetType

結果セットのタイプを表すint値を指定します。

resultSetConcurrency

結果セットの同時性タイプを表すint値を指定します。

resultSetHoldability

結果セットの持続性タイプを表すint値を指定します。

translating

文が翻訳をサポートするかどうかを指定します。

戻り値

createStatement()メソッドは、Statementオブジェクトを戻します。

例外

createStatement()メソッドは、SQLExceptionをスローします。

例

例を実行する前に次のパッケージをインポートします。

import java.sql.*;
import java.util.Properties;

import oracle.jdbc.OracleConnection;
import oracle.jdbc.OracleTranslatingConnection;
import oracle.jdbc.pool.OracleDataSource;

次のSQL文を実行します。

conn system/manager;
grant create sql translation profile to HR;

conn HR/hr;
drop table sample_tab;
create table sample_tab (c1 number, c2 varchar2(100));
insert into sample_tab values (1, 'A');
insert into sample_tab values (2, 'B');
commit;
exec dbms_sql_translator.drop_profile('FOO');
exec  dbms_sql_translator.create_profile('FOO');
exec  dbms_sql_translator.register_sql_translation('FOO','select row of (c1, c2) from sample_tab','select c1, c2 from sample_tab');

例8-1 createStatement()メソッドの使用

public class SQLTransStmt
{
static String url="jdbc:oracle:thin:@localhost:5521:orcl";
static String user="HR", pwd="hr";
static String PROFILE = "FOO";
static String primitiveSql = "select row of (c1, c2) from sample_tab";

public static void main(String[] args) throws Exception
{
OracleDataSource ods = new OracleDataSource();
ods.setURL(url);

Properties props = new Properties();
props.put("user", user);
props.put("password", pwd);
props.put(OracleConnection.CONNECTION_PROPERTY_SQL_TRANSLATION_PROFILE, PROFILE);
ods.setConnectionProperties(props);
Connection conn = ods.getConnection();
System.out.println("connection for SQL translation: "+conn);

try{
OracleTranslatingConnection trConn = (OracleTranslatingConnection) conn;
System.out.println("Call: oracle.jdbc.OracleTranslatingConnection.createStatement(true)");
Statement trStmt = trConn.createStatement(true);
System.out.println("executeQuery for: "+primitiveSql);
ResultSet trRs = trStmt.executeQuery(primitiveSql);
while (trRs.next())
System.out.println("C1:"+trRs.getInt(1)+", C2:"+trRs.getString(2));
trRs.close();
trStmt.close();
}catch (Exception e) {
e.printStackTrace();
}

try{
OracleTranslatingConnection trConn = (OracleTranslatingConnection) conn;
System.out.println("Call: oracle.jdbc.OracleTranslatingConnection.createStatement(false)");
Statement trStmt = trConn.createStatement(false);
System.out.println("executeQuery for: "+primitiveSql);
ResultSet trRs = trStmt.executeQuery(primitiveSql);
while (trRs.next())
System.out.println("C1:"+trRs.getInt(1)+", C2:"+trRs.getString(2));
trRs.close();
trStmt.close();
}catch (Exception e) {
System.out.println("expected Exception: "+e.getMessage());
}

try{
OracleTranslatingConnection trConn = (OracleTranslatingConnection) conn;
System.out.println("Call: oracle.jdbc.OracleTranslatingConnection.
createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE, true)");
Statement trStmt = trConn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE, true);
System.out.println("executeQuery for: "+primitiveSql);
ResultSet trRs = trStmt.executeQuery(primitiveSql);
while (trRs.next())
System.out.println("C1:"+trRs.getInt(1)+", C2:"+trRs.getString(2));
System.out.println("move resultset back to 2nd row...");
trRs.absolute(2);
while (trRs.next())
System.out.println("C1:"+trRs.getInt(1)+", C2:"+trRs.getString(2));
trRs.close();
trStmt.close();
}catch (Exception e) {
e.printStackTrace();
}

try{
conn.setAutoCommit(false);
OracleTranslatingConnection trConn = (OracleTranslatingConnection) conn;
System.out.println("Call: oracle.jdbc.OracleTranslatingConnection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE,
ResultSet.HOLD_CURSORS_OVER_COMMIT, true)");
Statement trStmt = trConn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE, ResultSet.HOLD_CURSORS_OVER_COMMIT, true);
System.out.println("executeQuery for: "+primitiveSql);
ResultSet trRs = trStmt.executeQuery(primitiveSql);
trRs.last();
System.out.println("C1:"+trRs.getInt(1)+", C2:"+trRs.getString(2));
trRs.updateString(2, "Hello");
trRs.updateRow();
conn.commit();
System.out.println("accept the update and list all of the rows again...");
trRs.beforeFirst();
while (trRs.next())
System.out.println("C1:"+trRs.getInt(1)+", C2:"+trRs.getString(2));
trRs.close();
trStmt.close();
}catch (Exception e) {
e.printStackTrace();
}

conn.close();
}
}

prepareCall()

このグループのメソッドは、CallableStatementオブジェクトを作成し、文がSQL翻訳をサポートするかどうかを指定します。パラメータtranslatingの値がTRUEの場合、戻り文は翻訳をサポートしません。値がFALSEの場合、戻り文は翻訳をサポートしません。

構文

説明

public CallableStatement prepareCall(
String sql,
boolean translating)
throws SQLException;

SQLを翻訳するオプションまたは翻訳しないオプションを指定してCallableStatementオブジェクトを作成します。

public CallableStatement prepareCall(
String sql,
int resultSetType,
int resultSetConcurrency,
boolean translating)
throws SQLException;

SQLを翻訳するオプションまたは翻訳しないオプションを指定して、指定のタイプと同時性でCallableStatementオブジェクトを作成します。

public CallableStatement prepareCall(
String sql,
int resultSetType,
int resultSetConcurrency,
int resultSetHoldability,
boolean translating)
throws SQLException;

SQLを翻訳するオプションまたは翻訳しないオプションを指定して、指定のタイプ、同時性および持続性でCallableStatementオブジェクトを作成します。

パラメータ

パラメータ

説明

sql

データベースに送信されるString SQL文の値を指定します。この中には、1つ以上のパラメータが含まれます。

resultSetType

結果セットのタイプを表すint値を指定します。

resultSetConcurrency

結果セットの同時性タイプを表すint値を指定します。

resultSetHoldability

結果セットの持続性タイプを表すint値を指定します。

translating

文が翻訳をサポートするかどうかを指定します。

戻り値

prepareCall()メソッドはCallableStatementオブジェクトを戻します。

例外

prepareCall()メソッドは、SQLExceptionをスローします。

例

例を実行する前に次のパッケージをインポートします。

import java.sql.*;
import java.util.Properties;

import oracle.jdbc.OracleConnection;
import oracle.jdbc.OracleTranslatingConnection;
import oracle.jdbc.pool.OracleDataSource;

次のSQL文を実行します。

conn system/manager;
grant create sql translation profile to HR;

conn HR/hr;

create or replace procedure sample_proc (p_num number, p_vchar in out varchar2) AS
begin
p_vchar := 'p_num'||p_num||',  p_vchar'||p_vchar;
end;
/

exec dbms_sql_translator.drop_profile('FOO');
exec  dbms_sql_translator.create_profile('FOO');
exec  dbms_sql_translator.register_sql_translation('FOO', 'exec sample_proc(:b1, :b2)', '{call sample_proc(:b1, :b2)}');

例8-2 prepareCall()メソッドの使用

public class SQLTransCstmt
{
static String url="jdbc:oracle:thin:@localhost:5521:orcl";
static String user="HR", pwd="hr";
static String PROFILE = "FOO";
static String primitiveSql = "exec sample_proc(:b1, :b2)";

public static void main(String[] args) throws Exception
{
OracleDataSource ods = new OracleDataSource();
ods.setURL(url);

Properties props = new Properties();
props.put("user", user);
props.put("password", pwd);
props.put(OracleConnection.CONNECTION_PROPERTY_SQL_TRANSLATION_PROFILE,
PROFILE);
ods.setConnectionProperties(props);
Connection conn = ods.getConnection();
System.out.println("connection for SQL translation: "+conn);

try{
OracleTranslatingConnection trConn = (OracleTranslatingConnection) conn;
System.out.println(
"Call: oracle.jdbc.OracleTranslatingConnection.prepareCall(sql, true)");
CallableStatement trStmt = trConn.prepareCall(primitiveSql, true);
trStmt.setInt("b1", 1);
trStmt.setString("b2", "A");
trStmt.registerOutParameter("b2", Types.VARCHAR);
System.out.println("execute for: "+primitiveSql);
trStmt.execute();
System.out.println("out param: "+trStmt.getString("b2"));

trStmt.close();
}catch (Exception e) {
e.printStackTrace();
}

try{
OracleTranslatingConnection trConn = (OracleTranslatingConnection) conn;
System.out.println(
"Call: oracle.jdbc.OracleTranslatingConnection.prepareCall(sql, false)");
CallableStatement trStmt = trConn.prepareCall(primitiveSql, false);
trStmt.setInt(1, 1);
trStmt.setString(2, "A");
System.out.println("execute for: "+primitiveSql);
ResultSet trRs = trStmt.executeQuery();
while (trRs.next())
System.out.println("C1:"+trRs.getInt(1)+", C2:"+trRs.getString(2));
trRs.close();

trStmt.close();
}catch (Exception e) {
System.out.println("expected Exception: "+e.getMessage());
}

conn.close();
}
}

prepareStatement()

このグループのメソッドは、PreparedStatementオブジェクトを作成し、文がSQL翻訳をサポートするかどうかを指定します。パラメータtranslatingの値がTRUEの場合、戻り文は翻訳をサポートしません。値がFALSEの場合、戻り文は翻訳をサポートしません。

構文

説明

public PreparedStatement prepareStatement(
String sql,
boolean translating)
throws SQLException;

SQLを翻訳するオプションまたは翻訳しないオプションを指定してPreparedStatementオブジェクトを作成します。

public PreparedStatement prepareStatement(
String sql,
int resultSetType,
int resultSetConcur,
boolean translating)
throws SQLException;

SQLを翻訳するオプションまたは翻訳しないオプションを指定して、指定のタイプと同時性でPreparedStatementオブジェクトを作成します。

public PreparedStatement prepareStatement(
String sql,
int resultSetType,
int resultSetConcur,
int resultSetHold,
boolean translating)
throws SQLException;

SQLを翻訳するオプションまたは翻訳しないオプションを指定して、指定のタイプ、同時性および持続性でPreparedStatementオブジェクトを作成します。

パラメータ

説明

sql

データベースに送信されるString SQL文の値を指定します。この中には、1つ以上のパラメータが含まれます。

resultSetType

結果セットのタイプを表すint値を指定します。

resultSetConcur

結果セットの同時性タイプを表すint値を指定します。

resultSetHold

結果セットの持続性タイプを表すint値を指定します。

translating

文が翻訳をサポートするかどうかを指定します。

戻り値

prepareStatement()メソッドはPreparedStatementオブジェクトを戻します。

使用上の注意

"?"プレースホルダをprepareStatement()メソッドで使用する場合、サーバー側トランスレータで操作できるのはOracleスタイルのマーカーのみであるため、ドライバは内部で"?"をOracleスタイルのパラメータに変更します。これは、バインド変数の区別に必要です。これを行わない場合、バインド変数の順序の変更が区別されません。置き換えられたOracleスタイルのマーカーは、形式:b<n>に従います。<n>は増分番号です。たとえば、exec sample_proc(?,?)はexec sample_proc(:b1,:b2)になります。

さらに実証するために、上位3行を選択するベンダー問合せがSELECT * FROM employees WHERE first_name=? AND employee_id=? TOP 3である、ベンダー形式のシナリオについて考えます。問合せはOracle言語に変換する必要があります。この場合、次の翻訳がサーバーに登録されます。

翻訳前:

SELECT * FROM employees WHERE first_name=:b1 AND employee_id=:b2 TOP 3

翻訳後:

SELECT * FROM employees WHERE first_name=:b1 AND employee_id=:b2 AND ROWNUM <= 3

詳細は、「SqlTranslationVersion」および「JDBCアプリケーションのSQL翻訳」を参照してください。

例外

prepareStatement()メソッドは、SQLExceptionをスローします。

例

例を実行する前に次のパッケージをインポートします。

import java.sql.*;
import java.util.Properties;

import oracle.jdbc.OracleConnection;
import oracle.jdbc.OracleTranslatingConnection;
import oracle.jdbc.pool.OracleDataSource;

次のSQL文を実行します。

conn system/manager;
grant create sql translation profile to HR;

conn HR/hr;
drop table sample_tab;
create table sample_tab (c1 number, c2 varchar2(100));
insert into sample_tab values (1, 'A');
insert into sample_tab values (1, 'A');
insert into sample_tab values (1, 'A');
commit;
exec dbms_sql_translator.drop_profile('FOO');
exec  dbms_sql_translator.create_profile('FOO');
exec  dbms_sql_translator.register_sql_translation('FOO','select row of select c1, c2 from sample_tab
where c1=:b1 and c2=:b2','select c1, c2 from sample_tab where c1=:b1 and c2=:b2');

例8-3 prepareStatement()メソッドの使用

public class SQLTransPstmt
{
static String url="jdbc:oracle:thin:@localhost:5521:orcl";
static String user="HR", pwd="hr";
static String PROFILE = "FOO";
static String primitiveSql = "select row of select c1, c2 from sample_tab
where c1=:b1 and c2=:b2";

public static void main(String[] args) throws Exception
{
OracleDataSource ods = new OracleDataSource();
ods.setURL(url);

Properties props = new Properties();
props.put("user", user);
props.put("password", pwd);
props.put(OracleConnection.CONNECTION_PROPERTY_SQL_TRANSLATION_PROFILE,
PROFILE);
ods.setConnectionProperties(props);
Connection conn = ods.getConnection();
System.out.println("connection for SQL translation: "+conn);

try{
OracleTranslatingConnection trConn = (OracleTranslatingConnection) conn;
System.out.println("Call:
oracle.jdbc.OracleTranslatingConnection.prepareStatement(sql, true)");
PreparedStatement trStmt = trConn.prepareStatement(primitiveSql, true);
trStmt.setInt(1, 1);
trStmt.setString(2, "A");
System.out.println("executeQuery for: "+primitiveSql);
ResultSet trRs = trStmt.executeQuery();
while (trRs.next())
System.out.println("C1:"+trRs.getInt(1)+", C2:"+trRs.getString(2));
trRs.close();
trStmt.close();
}catch (Exception e) {
e.printStackTrace();
}

try{
OracleTranslatingConnection trConn = (OracleTranslatingConnection) conn;
System.out.println("Call:
oracle.jdbc.OracleTranslatingConnection.prepareStatement(sql, false)");
PreparedStatement trStmt = trConn.prepareStatement(primitiveSql, false);
trStmt.setInt(1, 1);
trStmt.setString(2, "A");
System.out.println("executeQuery for: "+primitiveSql);
ResultSet trRs = trStmt.executeQuery();
while (trRs.next())
System.out.println("C1:"+trRs.getInt(1)+", C2:"+trRs.getString(2));
trRs.close();

trStmt.close();
}catch (Exception e) {
System.out.println("expected Exception: "+e.getMessage());
}

try{
OracleTranslatingConnection trConn = (OracleTranslatingConnection) conn;
System.out.println("Call:
oracle.jdbc.OracleTranslatingConnection.prepareStatement(
sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE, true)");
PreparedStatement trStmt = trConn.prepareStatement(
primitiveSql, ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY, true);
trStmt.setInt(1, 1);
trStmt.setString(2, "A");
System.out.println("executeQuery for: "+primitiveSql);
ResultSet trRs = trStmt.executeQuery();
while (trRs.next())
System.out.println("C1:"+trRs.getInt(1)+", C2:"+trRs.getString(2));

System.out.println("trRs.beforeFirst and show resultSet again...");
trRs.beforeFirst();
while (trRs.next())
System.out.println("C1:"+trRs.getInt(1)+", C2:"+trRs.getString(2));
trRs.close();
trStmt.close();
}catch (Exception e) {
e.printStackTrace();
}

conn.close();
}
}

getSQLTranslationVersions()

SQL翻訳時に問合せのすべての翻訳バージョンのマップを戻します。例外の場合、およびsuppressExceptionsがtrueの場合、マップ内の翻訳されたバージョンはNULLです。

構文

public Map<SqlTranslationVersion, String> getSqlTranslationVersions(
String sql,
boolean suppressExceptions)
throws SQL Exception;

戻り値

問合せのすべての翻訳バージョンを含むマップ。返されるバージョンの詳細は、SqlTranslationVersionのenumを参照してください。

例外

suppressExceptionsがfalseの場合、問合せの翻訳で問題があると、このメソッドはSQLExceptionをスローします。

エラー翻訳構成ファイル

XML構成ファイル(パス)は、oracle.jdbc.sqlErrorTranslationFileプロパティの値として指定されます。このファイルには、エラーの翻訳情報が含まれます。これらのエラーは、サーバーへの接続が確立できないために、サーバー上で翻訳が行われない場合に生じます。エラー・メッセージは、接続を確立できないデータベースの状態を定義するタイプです。

構成XMLファイルの構造は、次のようにDTDで定義されます。

<!DOCTYPE LocalTranslationProfile[

<!ELEMENT LocalTranslationProfile (Exception+)>
<!ELEMENT Exception (ORAError, ErrorCode, SQLState )>
<!ELEMENT ORAError (#PCDATA)>
<!ELEMENT ErrorCode (#PCDATA)>
<!ELEMENT SQLState (#PCDATA)>
]>

内容は次のとおりです。

- ORAErrorはint値で、Oracleエラーのエラー・コードを指定します。

- ErrorCodeはint値で、ベンダーのエラー・コード(翻訳済コード)を指定します。

- SQLStateはString値で、ベンダーのSQL状態を指定します。

用語集

アダプタ

あるデータベースに格納されるデータへのアクセスを別のデータベースから有効にする場合に使用されるリアルタイムの固有ツール。アダプタは、一般的に、SQLの翻訳、データ型のマップ、およびSQL文、トリガー、ストアド・プロシージャの統合の促進に使用されます。

カスタムSQL翻訳

ユーザーが、SQL文のカスタム固有翻訳をSQL翻訳プロファイルに登録できるシナリオ。Oracle以外の文の翻訳時に、プロファイルは最初にカスタム翻訳を参照します。一致が見つからない場合、SQLトランスレータを呼び出します。

データ統合

異なるデータベース間でのデータの交換。リアルタイム・トランザクションで非同期に行われるか、バッチ処理で同期して行われます。

データ統合フレームワーク

異なるデータベース間でのデータ交換を可能にする場合に使用される一連のツールおよびプロセス。従来のフレームワークには、毎晩行われる様々なプロセス(大規模なバッチ抽出やフィードなど)、およびデータの大量ロードなどがあります。より新しいフレームワークには、ほぼリアルタイムで行われる毎日の小規模プロセスやフィードがあります。

データベース・スキーマの移行

Oracle以外のスキーマの表、列などのオブジェクトを特定および変換するプロセス。Oracle Databaseで必要な命名、サイズおよびその他変換に従います。

エラー翻訳

ユーザーが、エラー・コードやメッセージのベンダー固有の翻訳をSQL翻訳プロファイルに登録できるシナリオ。SQL実行時、クライアント・アプリケーションは、ベンダー固有のエラー・コードやメッセージに依存します。エラーが発生すると、Oracleエラー・コードやメッセージのかわりに、翻訳済エラー・コードおよびメッセージが戻されます。

移行

Oracle以外のアプリケーション(そのすべてのコンポーネント(アーキテクチャ、データ、SQLコード、クライアントなど)を含む)の変更プロセス。固有のデータベース管理システムではなく、Oracle RDBMSを使用します。

移行リポジトリ

Oracle SQL Developerが移行時にソースおよびターゲット・スキーマ・モデルのメタデータの管理に使用するOracle Databaseのデータ・ストア。複数の移行リポジトリを使用して、複数のデータベースからOracle Databaseに同時に移行できます。

Oracle Database Gateway

一貫したAPIを使用して、Oracle以外のシステムとのデータ統合を同期してサポートする一連のOracle製品。

Oracle GoldenGate

SQLサーバー、Sybase、DB2、Oracleなどのデータベースに格納される多様なデータソース間で、モジュール形式のトランザクションレベルのデータ統合をサポートするOracle製品。

Oracle SQL*Loader

フラット・ファイルからOracle Databaseへのデータのロードをサポートする、高速で柔軟性の高い無料のOracleユーティリティ。複数のデータ形式と多くの異なるエンコーディングをサポートします。並列データ・ロードもサポートします。

Oracle SQL Developer移行ウィザード

サード・パーティ・データベースからOracle Databaseへの移行をバッチ・モードで可能にするOracleツール。移行には、データ、スキーマ、オブジェクト、トリガー、ストアド・プロシージャが含まれます。

SQL言語

データベース・ベンダーによって実装されるSQLの変化形または拡張。クライアント・アプリケーションをサード・パーティ・データベースからOracleに移行する場合、Oracle以外のすべてのSQL文をOracle SQLに翻訳する必要があります。このようなOracle以外のSQL文が、クライアント・アプリケーションのソース・コードに埋め込まれるため、これらを見つけて翻訳する作業は、手動で時間がかかるタスクになります。このリリースでは、外部ベンダーのOracle以外のSQL文を受け入れて、実行前にランタイムで自動的に翻訳するようにOracle Databaseの機能が強化されています。

SQL翻訳プロファイル

Oracle以外のSQL文をOracle SQL言語に翻訳する方法を指示するデータベース・スキーマ・オブジェクト。このスキーマには、SQL実行時にエラーが発生した場合に戻されるエラー・コード、SQLSTATEおよびエラー・メッセージの翻訳も含まれます。

Oracle以外のSQL文を含むクライアント・アプリケーションをOracleに移行する場合、ユーザーはSQL翻訳プロファイルを作成し、アプリケーションのSQL文とエラーを翻訳するようにそのプロファイルを構成します。アプリケーションは、そのSQL文とエラーを翻訳するようにOracle Databaseで翻訳プロファイルをランタイムで設定します。

SQLトランスレータ

SQLトランスレータは、Oracleまたはサード・パーティ・ベンダーによって提供されるソフトウェア・コンポーネントで、Oracle Databaseにインストールされます。クライアント・プログラムのSQL文がOracle Database SQLコンパイラで処理される前にそのSQL文を翻訳します。翻訳したSQL文の実行でエラーが発生した場合、Oracle Database SQLコンパイラによって、Oracleエラー・メッセージが生成されます。

SQLSTATE

ANSI SQL標準で定義されるステータス・パラメータ。これは5文字の文字列で、SQL操作のステータスを示します。次に値の一部を示します。

- 00XXX: 無条件で正常に完了しました

- 01XXX: 警告

- 02XXX: データがありません

- 07XXX: 動的SQLエラー

- 08XXX: 接続例外

- 09XXX: アクション例外がトリガーされました

索引
A  C  D  E  F  G  I  J  L  M  N  O  P  R  S  T

A

管理ルーチンのAPI, 7.3

ATTR_RAISE_TRANSLATION_ERROR, 4.1.4

C

クライアント・ライブラリの初期化と終了のAPI, 7.3

接続管理のAPI, 7.3

createStatement(), 8

D

データ型のマッピング, 7.1

日時および期間データ型, 7.1.4

E

SQLからPL/SQLへのバインド処理の改善, 1.2.5

エラー処理, 7.2

エラー・レポートのAPI, 7.3

F

移行をサポートする機能, 1.2

G

getSQLTranslationVersions(), 8

I

アイデンティティ列, 1.2.3

暗黙的な文の結果, 1.2.4

情報ルーチンのAPI, 7.3

インタフェース

OracleTranslatingConnection, 8

J

JDBC API, 8

構成ファイル、8

SQLErrorTranslation.xml, 8

メソッド

createStatement(), 8

getSQLTranslationVersions(), 8

prepareCall(), 8

prepareStatement(), 8

OracleTranslatingConnectionインタフェース, 8 翻訳プロパティ, 8

sqlErrorTranslationFile, 8

sqlTranslationProfile, 8

アプリケーション移行に対するJDBCドライバ・サポート, 1.2.7 暗黙的結果のJDBCサポート, 1.2.4.1

L

liboramysqlドライバ, 6.1

liboramysqlライブラリ

接続, 6.1

Oracle Databaseへの接続, 6.4.2

エラー処理, 6.4.4

予想される相違, 6.4.6

グローバリゼーション, 6.4.5

移行の概要, 6.3

サポート対象のプラットフォーム, 6.4.3

使用, 6.4

M

データ型のマッピング, 7.1

Oracle MySQLクライアント・ライブラリ・ドライバ, 7.1

MySQLデータ型へのOracleデータ型のマッピング, 7.1.1 メソッド

createStatement(), 8

getSQLTranslationVersions(), 8

prepareCall(), 8

prepareStatement(), 8

Sybase JDBCアプリケーションの移行, 5.1

移行の取得, 5.1.3

移行の変換, 5.1.4

移行の生成, 5.1.5

データの移動, 5.1.6

移行の設定, 5.1.2

他のデータベース・ベンダーの移行サポート, 1.4, 1.4 その他のAPI, 7.3 my_init(), 7.3.1 MySQL API, 7.3 MySQLクライアント・ライブラリ・ドライバ

インストール, 6.2

mysql_affected_rows(), 7.3.2 mysql_autocommit(), 7.3.3 mysql_change_user(), 7.3.4 mysql_character_set_name(), 7.3.5 mysql_close(), 7.3.6 mysql_commit(), 7.3.7 mysql_connect(), 7.3.8 mysql_create_db(), 7.3.9 mysql_data_seek(), 7.3.10 mysql_debug(), 7.3.11 mysql_debug_info(), 7.3.12 mysql_drop_db(), 7.3.13 mysql_dump_debug_info(), 7.3.14 mysql_eof(), 7.3.15 mysql_errno(), 7.3.16 mysql_error(), 7.3.17 mysql_escape_string(), 7.3.18 mysql_fetch_field(), 7.3.19 mysql_fetch_field_direct(), 7.3.20 mysql_fetch_fields(), 7.3.21 mysql_fetch_lengths(), 7.3.22 mysql_fetch_row(), 7.3.23 mysql_field_count(), 7.3.24 mysql_field_seek(), 7.3.25 mysql_field_tell(), 7.3.26 mysql_free_result(), 7.3.27 mysql_get_character_set_info(), 7.3.28 mysql_get_client_info(), 7.3.29 mysql_get_client_version(), 7.3.30 mysql_get_host_info(), 7.3.31 mysql_get_proto_info(), 7.3.32 mysql_get_server_info(), 7.3.33 mysql_get_server_version(), 7.3.34 mysql_get_ssl_cipher(), 7.3.35 mysql_hex_string(), 7.3.36 mysql_info(), 7.3.37 mysql_init(), 7.3.38 mysql_insert_id(), 7.3.39 mysql_kill(), 7.3.40 mysql_library_end(), 7.3.41 mysql_library_init(), 7.3.42 mysql_list_dbs(), 7.3.43 mysql_list_fields(), 7.3.44 mysql_list_processes(), 7.3.45 mysql_list_tables(), 7.3.46 mysql_more_results(), 7.3.47 mysql_next_result(), 7.3.48 mysql_num_fields(), 7.3.49 mysql_num_rows(), 7.3.50 mysql_options(), 7.3.51 mysql_ping(), 7.3.52 mysql_query(), 7.3.53 mysql_read_query_result(), 7.3.54 mysql_real_connect(), 7.3.55 mysql_real_escape_string(), 7.3.56 mysql_real_query(), 7.3.57 mysql_refresh(), 7.3.58 mysql_reload(), 7.3.59 mysql_rollback(), 7.3.60 mysql_row_seek(), 7.3.61 mysql_row_tell(), 7.3.62 mysql_select_db(), 7.3.63 mysql_send_query(), 7.3.64 mysql_server_end(), 7.3.65 mysql_server_init(), 7.3.66 mysql_set_character_set(), 7.3.67 mysql_set_local_infile_default(), 7.3.68 mysql_set_local_infile_handler(), 7.3.69 mysql_set_server_option(), 7.3.70 mysql_shutdown(), 7.3.71 mysql_sqlstate(), 7.3.72 mysql_ssl_set(), 7.3.73 mysql_stat(), 7.3.74 mysql_stmt_affected_rows(), 7.3.75 mysql_stmt_attr_get(), 7.3.76 mysql_stmt_attr_set(), 7.3.77 mysql_stmt_bind_param(), 7.3.78 mysql_stmt_bind_result(), 7.3.79 mysql_stmt_close(), 7.3.80 mysql_stmt_data_seek(), 7.3.81 mysql_stmt_errno(), 7.3.82 mysql_stmt_error(), 7.3.83 mysql_stmt_execute(), 7.3.84 mysql_stmt_fetch(), 7.3.85 mysql_stmt_fetch_column(), 7.3.86 mysql_stmt_field_count(), 7.3.87 mysql_stmt_free_result(), 7.3.88 mysql_stmt_init(), 7.3.89 mysql_stmt_insert_id(), 7.3.90 mysql_stmt_next_result(), 7.3.91 mysql_stmt_num_rows(), 7.3.92 mysql_stmt_param_count(), 7.3.93 mysql_stmt_param_metadata(), 7.3.94 mysql_stmt_prepare(), 7.3.95 mysql_stmt_reset(), 7.3.96 mysql_stmt_result_metadata(), 7.3.97 mysql_stmt_row_seek(), 7.3.98 mysql_stmt_row_tell(), 7.3.99 mysql_stmt_send_long_data(), 7.3.100 mysql_stmt_sqlstate(), 7.3.101 mysql_stmt_store_result(), 7.3.102 mysql_store_result(), 7.3.103 mysql_thread_end(), 7.3.104 mysql_thread_id(), 7.3.105 mysql_thread_init(), 7.3.106 mysql_thread_safe(), 7.3.107 MYSQL_TYPE_BLOBデータ型, 7.1.2.1 MYSQL_TYPE_DATEデータ型, 7.1.2.2 MYSQL_TYPE_DATETIMEデータ型, 7.1.2.3 MYSQL_TYPE_DOUBLEデータ型, 7.1.2.4 MYSQL_TYPE_FLOATデータ型, 7.1.2.5 MYSQL_TYPE_LONGデータ型, 7.1.2.6 MYSQL_TYPE_LONG_BLOBデータ型, 7.1.2.7 MYSQL_TYPE_LONGLONGデータ型, 7.1.2.8 MYSQL_TYPE_MEDIUM_BLOBデータ型, 7.1.2.9 MYSQL_TYPE_NEWDECIMALデータ型, 7.1.2.10 MYSQL_TYPE_SHORTデータ型, 7.1.2.11 MYSQL_TYPE_STRINGデータ型, 7.1.2.12 MYSQL_TYPE_TIMEデータ型, 7.1.2.13 MYSQL_TYPE_TIMESTAMPデータ型, 7.1.2.14 MYSQL_TYPE_TINYデータ型, 7.1.2.15 MYSQL_TYPE_TINY_BLOBデータ型, 7.1.2.16 MYSQL_TYPE_VAR_STRINGデータ型, 7.1.2.17 mysql_use_result(), 7.3.108 mysql_warning_count(), 7.3.109

N

問合せの行制限と行オフセットのネイティブSQLでのサポート, 1.2.6

O

暗黙的結果のOCIサポート, 1.2.4.2

アプリケーション移行に対するODBCドライバ・サポート, 1.2.8

暗黙的結果のODBCサポート, 1.2.4.3

OEM TuningおよびPerformance Packs, 1.3.1

Oracle Database Gateways, 1.3.3

Oracle GoldenGate, 1.3.2

Oracle MySQLクライアント・ライブラリ・ドライバ, 7

Oracle SQL Developer

移行サポート, 3.1.1

設定, 3.1.2.1

Oracle SQL Developer, 1.3.4 OracleTranslatingConnectionインタフェース, 8

createStatement()メソッド, 8

getSQLTranslationVersions()メソッド, 8

prepareCall()メソッド, 8

prepareStatement()メソッド, 8

P

SQLトランスレータをインストールするための権限, 3.3

prepareCall(), 8

準備された文のAPI, 7.3

prepareStatement(), 8

移行をサポートする製品, 1.3

R

結果セットの処理のAPI, 7.3

S

SQL翻訳フレームワーク, 1.2.1

アーキテクチャ, 2.3

構成, 3.1, 3.2

インストール, 3.1, 3.2

SQL翻訳プロファイル, 2.2

SQLトランスレータ, 2.2

使用, 2.4

使用する場合, 2.1

JDBCアプリケーションのSQL翻訳, 4 JDBCアプリケーションのSQL翻訳, 4.1

エラー・メッセージの翻訳, 4.1.2

エラー翻訳, 4.1.5

翻訳したOracle言語問合せの実行, 4.1.4

パラメータ・マーカーの変換, 4.1.3

SQL翻訳プロファイル, 4.1.1

ODBCアプリケーションのSQL翻訳, 4, 4.2

エラー・メッセージの翻訳, 4.2.2

SQL翻訳プロファイル, 4.2.1

SQL翻訳プロファイル

設定, 3.2.2

sqlErrorTranslationFile, 8 SQLErrorTranslation.xml, 8 sqlTranslationProfile, 8 SqlTranslationVersionの列挙値, 8 文の構成と実行のAPI, 7.3

T

トランザクション制御のAPI, 7.3

翻訳プロパティ

sqlErrorTranslationFile, 8

sqlTranslationProfile, 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）、その他の対策を講じることは使用者の責任となります。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

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

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

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

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

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