1 移行をサポートするツールおよび製品の概要
アプリケーションをOracle Databaseに移行する前に、『Oracle Database概要』に記載されたいくつかの重要な点に注意する必要があります。
データベース中心のエンタープライズの移行について話し合う場合、データベースのスキーマとデータの実際の移行は、プロセスの一環にすぎないことを念頭に置いておくと役立ちます。コア・ビジネス・ソリューションの移行には多くの場合、組織の収益をもたらす製品やサービスを提供するために連携している複数のデータベースやアプリケーションが関係します。移行計画の準備の詳細は、『Oracle SQL Developerユーザーズ・ガイド』を参照してください。
移行をサポートするOracle Databaseの機能
Oracle Database 12cでは、Oracle以外のデータベース・アプリケーションのOracle Databaseへの移行プロセスを総合的に向上させる多数の機能が導入されました。
SQL翻訳フレームワーク
Oracle以外のデータベースからOracle Databaseへの移行の中心としては、Oracle以外のSQL文をOracle Databaseで使用可能なSQL文に変更することなどがあります。アプリケーションのOracle以外のSQL文の変換は、手動で単調なプロセスです。労力を最小限にしたり、文を変換する必要がなくなるように、Oracle Database 12cにSQL翻訳フレームワークと呼ばれる新機能が導入されました。SQL翻訳フレームワークは、クライアント・アプリケーションからSQL文を受信し、実行時に翻訳します。
SQL翻訳プロファイルは、Oracle以外のクライアント・アプリケーションの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文を翻訳する際、SQL翻訳には次の制限事項があります。
-
SQL翻訳では、次のSQLコンストラクトは無視されます。
-
表に対する
ENGINE
指定は使用されていません。Oracle
が唯一のストレージ・エンジンです。 -
ENUM
およびSET
型はVARCHAR2
として使用されます。これらの値が数値コンテキストで取得される場合は索引値に変換されません。
-
-
次のSQLコンストラクトの処理を試行すると、SQL翻訳でエラーが生成されます。アプリケーションをコーディングしなおす必要があります。
-
Oracleでは、
GEOMETRY
、POINT
、LINESTRING
、POLYGON
、GEOMETRYCOLLECTION
、MULTILINESTRING
、MULTIPOINT
、MULTIPOLYGON
などの空間データ型はサポートされていません。Oracleでは、MySQL固有のNLSコマンドはサポートされていません。
-
-
次のSQLコマンドでは、Oracle固有の出力またはOracle固有の効果が得られます。
-
SHOW DATABASES
は1つのデータベース(つまりoracle
)のみ表示します -
SHOW ENGINES
はOracle
エンジンのみ表示します -
CREATE PROCEDURE
はOracle Database 12cのOracle PL/SQL仕様に従う必要があります。
-
-
次のデータ型は、ネイティブ・データベースでの動作とOracle Databaseでの動作が異なります。
-
ENUM
データ型の列はVARCHAR2(4000)
として作成されます。挿入に対して検証は実行されません。 -
SET
データ型の列はVARCHAR2(64)
として作成されます。挿入に対して検証は実行されません。
-
詳細は、「Oracle用MySQLクライアント・ライブラリ・ドライバ」および「Oracle MySQLクライアント・ライブラリ・ドライバのAPIリファレンス」を参照してください。
アイデンティティ列のサポート
Oracle Database12cは、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 (‘abc'); INSERT INTO t1 (c1, c2) VALUES (null, ‘xyz'); SELECT c1, c2 FROM t1;
暗黙的な文の結果
Oracle Database 12cリリース2 (12.2)以降では、ストアド・プロシージャで実行された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リリース2 (12.2)より、JDBCアプリケーションで次の新しい関数を使用した暗黙的結果のサポートが提供されます。
-
getMoreResults
-
getMoreResults(int)
-
getResultSet
例1-2に示すように、これらのメソッドを使用して、PL/SQLプロシージャまたはブロックによって返された暗黙的結果を取得したり、処理できます。
詳細は、『Oracle Database JDBC開発者ガイド』を参照してください
JDBCでの暗黙的結果の処理
例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 */ } } }
暗黙的結果のOCIサポート
Oracle Database 12cリリース2 (12.2)より、Oracle Call Interface (OCI)で新しい関数OCIStmtGetNextResult()
を使用した暗黙的結果のサポートが提供されます。これは、Cアプリケーションによって繰り返し呼び出され、ストアド・プロシージャや匿名ブロックの各暗黙的結果を取得します。暗黙的結果は、RefCursor
を経由せずにストアド・プロシージャの行を直接使用します。
OCIでの暗黙的結果の処理
例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. */
暗黙的結果のODBCサポート
Oracle Database 12cより、ODBCアプリケーションで新しい関数SQLMoreResults()
を使用した暗黙的結果のサポートが提供されます。ODBCドライバは、移行プロセスを向上させる次の新しいOCI APIを使用できるよう機能拡張されています。
-
OCIStmtGetNextResult()
関数 -
OCI_ATTR_IMPLICIT_RESULT_COUNT
属性 -
OCI_RESULT_TYPE_SELECT
属性
暗黙的結果のODBCサポートにより、ストアド・プロシージャにバンドルされた複数の結果セットを使用するSybaseおよびSQL Serverアプリケーションの移行が可能になります。Oracleでは、文またはプロシージャをサーバーに送信し、サーバーでOracle以外のSQLをOracle構文に変換することでこれを実現します。
ODBCでの暗黙的結果の処理
例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 12cより、問合せの行制限と行のオフセットのネイティブSQLでのサポートを可能にする行制限句が提供されます。アプリケーションに、返される行数の制限または結果の開始行のオフセットを行う問合せがある場合、この機能によってそのような問合せのSQLの複雑性が大幅に軽減されます。
バルク選択の制限
例1-7に、FETCH FIRST
句を使用したバルク選択を制限する方法を示します。このトピックの詳細は、 『Oracle Database 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に、SQL翻訳に特化した新しいJDBC APIのセットが導入されました。
関連項目:
-
Oracle Database JDBC Java APIリファレンスの
oracle.jdbc
パッケージのドキュメント一式 -
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製品
移行戦略全体の一環として、いくつかのOracle製品の使用をお薦めします。
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では、各種データベースで実行するアプリケーションの移行サポートを用意しています。
サードパーティ・データベースにおけるアプリケーションのサポート
表1-1に、一部のサードパーティ・データベースでサポートされるアプリケーションの情報を示します。翻訳フレームワークは、DB2 LUWの場合に利用できますが、DB2のトランスレータは使用できません。
表1-1 データベースでサポートされるアプリケーション
アプリケーション | SQL Server | DB2 LUW | DB2 AS400 | Sybase ASE | Teradata | Informix |
---|---|---|---|---|---|---|
Oracle SQL Developer |
あり |
あり |
なし |
あり |
あり |
なし |
Oracle Migration Workbench |
なし |
なし |
あり |
なし |
なし |
あり |
SQL翻訳フレームワーク(SQL翻訳プロファイル) |
あり |
あり |
あり |
あり |
あり |
あり |
SQL翻訳フレームワーク(SQLトランスレータ) |
あり |
一部 |
なし |
あり |
なし |
なし |
サポートされるサードパーティ・データベースのバージョン
表1-2に、Oracle SQL Developerを使用した移行がサポートされるデータベース・バージョンをリストします。これは包括的なリストです。SQL翻訳は、すべてのデータベースに対して適切に機能するわけではありません。
表1-2 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 |