SQL ServerデータベースからAutonomous AI Databaseへのアプリケーションの移行

SQL文をSQL ServerからOracle SQLに移行し、Autonomous AI Databaseで文を実行できます。

SQL Server文のOracle SQLへの変換

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

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

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

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

SET SERVEROUTPUT ON
   declare output_sql_result CLOB;
BEGIN
  DBMS_CLOUD_MIGRATION.MIGRATE_SQL(
    original_sql => 'CREATE TABLE [dbo].[movie] ([film_id] [int], [title] [varchar](20));',
    output_sql   => output_sql_result,
    source_db    => 'SQLSERVER');
    DBMS_OUTPUT.PUT_LINE (output_sql_result);
END;
/

Output
--------------------------------------------------------------
CREATE TABLE movie (film_id NUMBER(10), title VARCHAR2(20));

original_sqlパラメータでは、SQL Server SQL文を指定します。

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

source_dbパラメータは、SQL Serverデータベースを指定します。

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

MIGRATE_SQL関数を使用したSQL Server文のOracle SQLへの移行

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

SELECT DBMS_CLOUD_MIGRATION.MIGRATE_SQL(
     'CREATE TABLE [dbo].[movie] ([film_id] [int], [title] [varchar](20));','SQLSERVER') AS OUTPUT
     FROM DUAL;

OUTPUT
------------------------------------------------------------------------------
CREATE TABLE movie (film_id NUMBER(10), title VARCHAR2(20));

SQLSERVERパラメータを使用して、Microsoft SQL Serverから変換します。

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

DBMS_CLOUD_MIGRATION.MIGRATE_SQLの実行に関するノート:

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

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

Autonomous AI DatabaseでのSQL Server文の実行

自律型AIデータベースでSQL Server文を対話形式で変換および実行できます。

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

たとえば、ENABLE_TRANSLATIONを実行して翻訳を有効にした後、セッションで対話的に次の操作を実行できます。

  • 表を作成します。たとえば、表MOVIEおよびINVENTORYを作成します。

  • データを表に挿入します。

  • 表を問い合せます。

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

SQL Server文を使用した変換を有効にし、コマンドを実行するには:

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

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

    ノート

    ノート: DBMS_CLOUD_MIGRATION.ENABLE_TRANSLATIONは、データベース・アクションではサポートされておらず、Oracle APEXサービスではサポートされていません。

  2. DBMS_CLOUD_MIGRATION.ENABLE_TRANSLATIONを実行して、セッションでリアルタイムSQL変換を有効にします。SQLSERVERパラメータを使用して、Microsoft SQL Serverから変換します。
    BEGIN
    DBMS_CLOUD_MIGRATION.ENABLE_TRANSLATION('SQLSERVER');
    END;
    /

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

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

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

  3. SQL Server SQL文を入力します。たとえば:

    CREATE TABLE [dbo].[movie] ([film_id] [int], [title] [varchar](20));
    
    Table [dbo].[movie] created.

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

    DESCコマンドを使用して確認できます。次に例を示します。

    DESC movie;
    
    Name        Null?     Type
    
    -------     -----     -------------
    FILM_ID               NUMBER(38)
    
    TITLE                 VARCHAR2(255)

    MOVIE表が作成され、各列のデータ型がOracleデータ型に自動的に変換されます。

  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 [dbo].[inventory] ([film_id] [int], [title] [inventory_id](20));
    
    
    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を実行します。問合せは、最初にOracle SQLに変換されてから、セッションで実行されます。

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

    BEGIN
     DBMS_CLOUD_MIGRATION.DISABLE_TRANSLATION;
    END;
    /

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

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

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

たとえば:

    SELECT v.*
    FROM v$mapped_sql v, dba_objects o
    WHERE v.sql_translation_profile_id = o.object_id
        AND o.object_name = 'SQLSERVER'
        AND o.object_type = 'TRANSLATION PROFILE';

詳細は、V$MAPPED_SQLを参照してください。

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

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

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

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

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

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

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

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

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

    BEGIN
    DBMS_CLOUD.CREATE_CREDENTIAL (
        credential_name => 'OBJ_STORE_CRED',
        username        => 'user1@example.com',
        password        => 'password'
    );
    END;
    /

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

  3. オプションで、オブジェクト・ストレージ内のファイルをリストできます。たとえば:

    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
    
    ---------------------
    mssqltest.sql

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

    詳細は、LIST_OBJECTSファンクションを参照してください。

  4. DBMS_CLOUD_MIGRATION.MIGRATE_FILEを実行して、SQL Serverファイルを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/mssqltest.sql',
         source_db       => 'SQLSERVER'
        );
    END;
    /

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

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

    source_dbパラメータでは、SQL Serverをデータベース言語として指定します。値SQLSERVERを使用して、SQL ServerファイルをOracle SQLに変換します。

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

    この例では、入力ファイルmssqltest.sqlを指定してDBMS_CLOUD_MIGRATION.MIGRATE_FILEを実行すると、mssqltest_oracle.sqlが生成されます。変換ステップの後、プロシージャはmssqltest_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
    
    ---------------------
    mssqltest.sql
    mssqltest_oracle.sql

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

    詳細は、LIST_OBJECTSファンクションを参照してください。

次の問合せを実行して、mssqltest_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
--------------------------------------------------------------------------------
DROP TABLE movie;
CREATE TABLE movie (film_id NUMBER(10), title VARCHAR2(20));

INSERT INTO movie (film_id, title) VALUES (123, 'Tangled');
INSERT INTO movie (film_id, title) VALUES (234, 'Frozen');

CREATE TABLE inventory(film_id NUMBER(10), inventory_id NUMBER(10));
INSERT INTO inventory(film_id, inventory_id) VALUES (123, 223);
INSERT INTO inventory(film_id, inventory_id) VALUES (234, 334);

SELECT * FROM movie;
SELECT * FROM inventory;
SELECT m.film_id, m.title, inventory_id FROM movie m LEFT JOIN inventory ON inventory.film_id = m.film_id;

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

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

SQL Server文のOracle SQLへの移行および変換に関する制限事項

この項では、SQL ServerからOracle SQLへのSQL文の移行に関する制限事項の概要を示します。

SQL Serverデータベース・フレーバからOracle SQLに移行する場合、次のSQL Serverファンクションのリストはサポートされていません。

  • ISJSON()

  • OPENJSON()