Oracle DatabasesからAutonomous Databaseへのアプリケーションの移行

Oracle以外のデータベースからOracle SQLにSQL文を移行し、Autonomous Databaseで文を実行できます。

アプリケーション移行の概要

アプリケーションの移行には、ある環境から別の環境へのアプリケーションの移動が含まれます。移行プロセスには、Oracle以外のデータベースからOracle SQLへのSQL文の移行など、様々なタスクが含まれます。

DBMS_CLOUD_MIGRATIONパッケージを使用すると、Oracle以外のデータベース用に書き込まれたSQL文をOracle SQLに変換できます。これにより、異なるSQLフレーバを使用するOracle以外のデータベース用にアプリケーションを開発したときに、アプリケーションをAutonomous Databaseに簡単に移行できます。

DBMS_CLOUD_MIGRATIONパッケージは、次のOracle以外のデータベースからのSQLコードの移行をサポートしています。

  • PostgreSQL

DBMS_CLOUD_MIGRATIONパッケージには、次のことを可能にするルーチンが用意されています。

  • 個々のSQL文をOracle以外のデータベースからOracle SQLに変換します。詳細は、「PostgreSQL文のOracle SQLへの変換」を参照してください。

  • SQLコードを含むファイルをOracle以外のデータベースからOracle SQLに変換し、変換されたOracle SQLを含む新しいファイルを生成します。詳細は、Oracle SQLへのPostgreSQLファイルの移行を参照してください。

  • セッション内で対話的に作業し、Oracle以外のシステムからSQL文を入力します。この場合、Oracle以外の文は変換され、セッション内で対話的に実行されます。詳細は、Autonomous DatabaseでのPostgreSQL文の実行を参照してください。

ノート

DBMS_CLOUD_MIGRATIONでサブプログラムを実行するには、ADMINユーザーとしてログインするか、DBMS_CLOUD_MIGRATIONに対するEXECUTE権限を持っている必要があります。

PostgreSQL文のOracle SQLへの変換

PostgreSQLで記述されたSQL文をOracle SQLに変換し、Autonomous Databaseで変換された文を実行できます。

DBMS_CLOUD_MIGRATION.MIGRATE_SQLを使用して、Oracle以外のSQL文をOracle SQLに変換します。DBMS_CLOUD_MIGRATION.MIGRATE_SQLにはプロシージャおよびファンクションのバリアントがあります。

MIGRATE_SQLプロシージャを使用したPostgreSQL文のOracle SQLへの移行

次の例では、PostgreSQLで記述されたSQL文を入力として受け入れ、文をOracle SQLに変換し、変換されたSQL文をoutput_sql_resultに割り当てて、結果を出力します。

SET SERVEROUTPUT ON
   declare output_sql_result CLOB;
BEGIN
  DBMS_CLOUD_MIGRATION.MIGRATE_SQL(      
    original_sql => 'SELECT e.employee_id, e.last_name, e.salary FROM employees AS e;',
    output_sql   => output_sql_result,
    source_db    => 'POSTGRES'),
    DBMS_OUTPUT.PUT_LINE (output_sql_result);
END;        
/

Output
–-------------------------------------------------------------
SELECT e.employee_id, e.last_name, e.salary FROM employees e;

original_sqlパラメータは、Oracle以外のSQL文を指定します。

output_sqlパラメータには、変換されたSQLが格納されます。

source_dbパラメータは、Oracle以外のSQLデータベース名を指定します。

詳細は、MIGRATE_SQLプロシージャおよびファンクションを参照してください。

MIGRATE_SQL関数を使用して、PostgreSQL文をOracle SQLに移行します

次の例は、SELECT文内のDBMS_CLOUD_MIGRATION.MIGRATE_SQL関数を示しています。ファンクション入力はPosgresSQL文で、ファンクションはOracle SQLで変換された文を返します。

SELECT DBMS_CLOUD_MIGRATION.MIGRATE_SQL(
     'CREATE TABLE IF NOT EXISTS cars (brand VARCHAR(255), model VARCHAR(255), year INT)',
     'POSTGRES') AS output FROM DUAL;

OUTPUT
------------------------------------------------------------------------------
create table cars (brand VARCHAR2(255), model VARCHAR2(255), year NUMBER(10);

詳細は、MIGRATE_SQLプロシージャおよびファンクションを参照してください。

DBMS_CLOUD_MIGRATION.MIGRATE_SQLを実行するためのノート:

  • Oracle SQLで入力SQL文がサポートされていない場合、変換中にエラーが発生することがあります。詳細は、Oracle以外のSQLからOracle SQLへの移行および翻訳の制限事項を参照してください。

  • DBMS_CLOUD_MIGRATION.MIGRATE_SQLサブプログラムは、入力として1つのSQL文のみを受け入れます。そのため、コールごとに変換できるSQL文は1つのみです。

Oracle SQLへのPostgreSQLファイルの移行

PostgreSQL文を含むファイルをOracle SQL文を含むファイルに移行できます。

DBMS_CLOUD_MIGRATION.MIGRATE_FILEプロシージャは、オブジェクト・ストレージのPostgreSQLファイル内のSQL文を変換し、Oracle SQLを含む新しいファイルを生成します。

前提条件として、.sql拡張子を持つ1つ以上のPostgreSQLファイルをオブジェクト・ストレージの場所にアップロードします。次の例では、オブジェクト・ストレージにアップロードされるファイルpostgrestest.sqlを使用します。詳細は、「オブジェクト・ストレージへのデータの配置」を参照してください。

PostgreSQLファイルをOracle SQLに移行するには:

  1. Autonomous Databaseインスタンスに接続します。

    詳細は、Autonomous Databaseへの接続を参照してください。

  2. リソース・プリンシパルを使用するか、資格証明オブジェクトを作成して、クラウド・オブジェクト・ストレージへのアクセスを構成します。

    このステップでは、移行するファイルを配置するクラウド・オブジェクト・ストレージにアクセスできます:

  3. オプションで、Object Storageのファイルをリストできます。例:
    VAR function_list CLOB;
    SELECT object_name FROM DBMS_CLOUD.LIST_OBJECTS
       (credential_name => 'OCI$RESOURCE_PRINCIPAL', location_uri => 'https://objectstorage.region.oraclecloud.com/n/namespace/b/bucket/o/files');
    
    OBJECT_NAME
    ---------------------
    postgrestest.sql
    

    または、リソース・プリンシパルOCI$RESOURCE_PRINCIPALのかわりに資格証明を作成する場合は、credential_nameパラメータに資格証明名を指定します。

    詳細は、LIST_OBJECTS関数に関する項を参照してください。

  4. DBMS_CLOUD_MIGRATION.MIGRATE_FILEを実行して、PostgreSQLファイルをOracle SQLに移行します。
    BEGIN
     DBMS_CLOUD_MIGRATION.MIGRATE_FILE (
         credential_name => 'OCI$RESOURCE_PRINCIPAL',
         location_uri    => 'https://objectstorage.region.oraclecloud.com/n/namespace/b/bucket/o/files/postgrestest.sql',
         source_db       => 'POSTGRES'
        );
    END;
    /

    credential_nameパラメータでは、クラウド・オブジェクト・ストレージURIにアクセスするための資格証明を指定します。DBMS_CLOUD_MIGRATION.MIGRATE_FILEを実行するユーザーは、オブジェクト・ストレージURIへのアクセスに使用される資格証明オブジェクトに対するEXECUTE権限を持っている必要があります。つまり、credential_nameパラメータで指定する資格証明です。リソース・プリンシパルのかわりに資格証明を使用する場合は、credential_nameパラメータで資格証明名を指定します。

    location_uriパラメータは、ソース・ファイルURIを指定します。URIの形式は、使用しているクラウド・オブジェクト・ストレージ・サービスによって異なります。詳細は、DBMS_CLOUD URI形式を参照してください。

    source_dbパラメータは、Oracle以外のデータベース言語を指定します。値POSTGRESを使用して、PostgreSQLファイルをOracle SQLに変換します。

    このコマンドを実行すると、PostgreSQLファイルpostgrestest.sqlがOracle SQLに変換され、original_filename_oracle.sqlという名前の新しいファイルが生成されます。

    この例では、入力ファイルpostgrestest.sqlを指定してDBMS_CLOUD_MIGRATION.MIGRATE_FILEを実行すると、postgrestest_oracle.sqlが生成されます。変換ステップの後、プロシージャはpostgrestest_oracle.sqlをオブジェクト・ストレージにアップロードします。

    オプションで、target_uriパラメータを使用して、翻訳済ファイルがアップロードされる場所を指定します。このパラメータのデフォルト値はNULLです。つまり、変換されたファイルは、location_uriパラメータで指定された場所と同じ場所にアップロードされます。

    詳細は、MIGRATE_FILEプロシージャを参照してください。

  5. 出力ファイルが生成されたことを確認します。
    SELECT object_name FROM DBMS_CLOUD.LIST_OBJECTS (
        credential_name => 'OCI$RESOURCE_PRINCIPAL', location_uri => 'https://objectstorage.region.oraclecloud.com/n/namespace/b/bucket/o/files');
    
    OBJECT_NAME
    ---------------------
    postgrestest.sql
    postgrestest_oracle.sql
    

    または、リソース・プリンシパルOCI$RESOURCE_PRINCIPALのかわりに資格証明を作成する場合は、credential_nameパラメータに資格証明名を指定します。

    詳細は、LIST_OBJECTS関数に関する項を参照してください。

次の問合せを実行して、postgrestest_oracle.sqlファイルの内容を表示します。

SELECT UTL_RAW.CAST_TO_VARCHAR2 (DBMS_CLOUD.GET_OBJECT(
   credential_name => 'OCI$RESOURCE_PRINCIPAL', 
   object_uri => 'https://objectstorage.region.oraclecloud.com/n/namespace/b/bucket/o/files')) 
FROM dual;

UTL_RAW.CAST_TO_VARCHAR2(DBMS_CLOUD.GET_OBJECT(CREDENTIAL_NAME=>'CRED1',OBJECT_U
--------------------------------------------------------------------------------
SELECT f.film_id, f.title, inventory_id
FROM film f LEFT JOIN inventory
ON inventory.film_id = f.film_id;

または、リソース・プリンシパルOCI$RESOURCE_PRINCIPALのかわりに資格証明を作成する場合は、credential_nameパラメータに資格証明名を指定します。

詳細は、GET_OBJECTプロシージャおよびファンクションを参照してください。

Autonomous DatabaseでのPostgreSQL文の実行

Autonomous DatabaseでPostgreSQL文を対話形式で変換および実行できます。

ENABLE_TRANSLATIONプロシージャを使用して、指定したOracle以外のデータベース言語(PostgreSQLなど)で記述されたSQL文のリアルタイム変換を有効にします。セッションで変換を有効にすると、Oracle以外のSQL文が自動的に変換されてOracle SQL文として実行され、結果を確認できます。

たとえば、ENABLE_TRANSLATIONを実行して変換を有効にした後、セッションで対話的に次の操作を実行できます。
  • 表を作成します。たとえば、表MOVIEおよびINVENTORYを作成します。

  • データを表に挿入

  • 問合せ表

  • 表に対してJOIN操作を実行します。たとえば、表に対して左外部結合を実行できます。

PostgreSQLを使用して変換を有効にし、コマンドを実行するには:

  1. SQLクライアントを使用してAutonomous Databaseに接続します。

    詳細は、Autonomous Databaseへの接続を参照してください。

    ノート

    DBMS_CLOUD_MIGRATION.ENABLE_TRANSLATIONは、データベース・アクションではサポートされておらず、Oracle APEXサービスではサポートされていません。
  2. DBMS_CLOUD_MIGRATION.ENABLE_TRANSLATIONを実行して、セッションでリアルタイムSQL変換を有効にします。
    BEGIN
     DBMS_CLOUD_MIGRATION.ENABLE_TRANSLATION('POSTGRES');
    END;
    /

    次の問合せを使用して、セッションのSQL翻訳言語を確認します。

    SELECT SYS_CONTEXT('USERENV','SQL_TRANSLATION_PROFILE_NAME') FROM DUAL;

    詳細は、ENABLE_TRANSLATIONプロシージャを参照してください。

  3. PostgreSQL文を入力します。たとえば:
    CREATE TABLE movie (film_id int, title varchar(255));
    
    Table MOVIE created.

    これにより、PostgreSQL CREATE TABLE文が自動的に変換および実行されます。

    DESCコマンドを使用して確認できます。たとえば:
    DESC movie;
    
    Name        Null?     Type          
    -------     -----     ------------- 
    FILM_ID               NUMBER(38)    
    TITLE                 VARCHAR2(255)
    MOVIE表が作成され、各列のデータ型がOracleデータ型に自動的に変換されます。

    入力SQL文がサポートされていない場合、変換中にエラーが発生することがあります。詳細は、Oracle以外のSQLからOracle SQLへの移行および翻訳の制限事項を参照してください。

  4. MOVIE表にデータを挿入します。例:
    INSERT INTO movie (film_id, title) VALUES (123, 'Tangled');
    
    1 row inserted.
    
    INSERT INTO movie (film_id, title) VALUES (234, 'Frozen');
    
    1 row inserted.

    MOVIE表を問い合せて、データの挿入を確認します。たとえば:

    SELECT * FROM movie;
    
    FILM_ID    TITLE
    –-------   –--------
    123	 Tangled
    234	 Frozen
    
  5. INVENTORY表を作成します。
    CREATE TABLE inventory (film_id int, inventory_id int);
    
    Table INVENTORY created.
    このステップは、DESCコマンドを使用して確認できます。たとえば:
    DESC inventory;
    
    Name        Null?     Type          
    -------     -----     ------------- 
    FILM_ID               NUMBER(38)    
    INVENTORY_ID          NUMBER(38)
    INVENTORY表が作成され、各列のデータ型がOracleデータ型に自動的に変換されます。
  6. INVENTORY表にデータを挿入します。例:
    INSERT INTO inventory(film_id, inventory_id) VALUES (123, 223);
    
    1 row inserted.
    
    INSERT INTO inventory(film_id, inventory_id) VALUES (234, 334);
    
    1 row inserted.

    INVENTORYを問い合せて、データの挿入を確認します。たとえば:

    SELECT * FROM inventory;
    
    FILM_ID    INVENTORY_ID
    –-------   –------------
    123	 223
    234	 334
    
  7. MOVIEおよびINVENTORYで左外部結合を実行します。
    SELECT m.film_id, m.title, inventory.inventory_id 
        FROM movie AS m LEFT JOIN inventory 
        ON inventory.film_id = m.film_id;
    
      FILM_ID  TITLE       INVENTORY_ID
    ---------- ---------- ------------
           234 Frozen      334
           123 Tangled     223
    

    この例では、movie表およびinventory表でLEFT OUTER JOINを実行します。FROM句の表別名に対するASキーワードは、Oracle SQLではサポートされていません。問合せは、最初にOracle SQLに変換されてから、セッションで実行されます。

  8. DBMS_CLOUD_MIGRATION.DISABLE_TRANSLATIONプロシージャを使用して、セッションのリアルタイムSQL言語変換を無効にします。
    BEGIN
     DBMS_CLOUD_MIGRATION.DISABLE_TRANSLATION;
    END;
    /

    SQL言語変換がセッションで有効になっていない場合は、エラーが返されます。

    DISABLE_TRANSLATIONプロシージャを参照してください

V$MAPPED_SQLビューを問い合せると、メモリーに変換されてOracle SQL文にマップされるPostgreSQL文をリストできます。

たとえば:

SELECT v.* 
    FROM v$mapped_sql v, dba_objects o
    WHERE v.sql_translation_profile_id = o.object_id
        AND o.object_name = 'POSTGRES'
        AND o.object_type = 'TRANSLATION PROFILE';
詳細は、V$MAPPED_SQLを参照してください。

Oracle以外のSQLからOracle SQLへの移行および変換の制限

この項では、Oracle以外のデータベースからOracle SQLへのSQL文の移行に関する制限事項の概要を示します。

PostgreSQL文の移行および翻訳の制限

Autonomous Databaseへの移行時には、次のPostgreSQL文のリストはサポートされていません:
  • CREATE DOMAIN
  • CREATE EXTENSION
  • CREATE DATABASE
  • CREATE TYPE
  • SET
次のPostgreSQL文のリストが制限付きでサポートされています。
  • ALTER TABLE: Autonomous Databaseに移行する場合、ALTER TABLE ADD CONSTRAINTのみがサポートされます。
  • DELETE: DELETE文のRETURNING *キーワードは、Autonomous Databaseではサポートされていません。RETURNING *句は、RETURNING INTO句に置き換える必要があります。たとえば、DELETE FROM tasks WHERE status = 'DONE' RETURNING *;です。

    詳細は、RETURNING INTO句を参照してください。

  • CREATE FUNCTION: CREATE FUNCTIONでは、次はサポートされていません。
    • SETOF戻り型。SETOFCURSORSまたはCOLLECTIONS戻り型に置き換える必要があります。
    • IMMUTABLE句。
    • FUNCTION_NAME (DATATYPE, DATATYPE)形式のパラメータ宣言。
  • ALTER FUNCTION: ALTER FUNCTION関数の引数(RENAME TOOWNER TOSET SCHEMAなど)はサポートされていません。