0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

SQL Server Migration Assistant for Oracle による Oracle Database から Azure SQL Database への移行検証~Oracle データ操作言語( DML )文編~

Last updated at Posted at 2023-04-09

概要

本記事の位置付けについて

Oracle Database から Azure SQL Database へ SQL Server Migration Assistant for Oracle (SSMA)によるプログラム移行検証結果の一部である。次の記事にて個別機能別記事へのリンクを整理している。

データ操作言語( DML )文について

データ操作言語( DML )文について、Oracle Database ドキュメントにて、次のように記載されている。

Oracle Database表のデータを追加、変更および削除します。

引用元:3 DML文とトランザクションについて (oracle.com)

参考リンク

  • ホワイトペーパー
    • Oracle to SQL Server Migration Handbook v 2.0

Azure SQL Database への移行

SSMA による変換

基本的な DDL 文であれば、自動変換される。

Oracle 方言で記載されている場合には、issues となる場合がある。

移行方針

特になし。

変換例

事前準備

Oracle Database の事前準備
CREATE TABLE dml_test_001 
(
    ID INT
    ,NAME NVARCHAR2(50)
)
/
CREATE TABLE dml_test_002
(
    ID INT
    ,NAME NVARCHAR2(50)
)

変換例 1 INSERT 文

Oracle Database のコード
INSERT INTO dml_test_001
SELECT
    *
    FROM (
        SELECT 1 AS ID, 'AAA' AS NAME FROM DUAL
        UNION ALL
        SELECT 2 AS ID, 'BBB' AS NAME FROM DUAL
        UNION ALL
        SELECT 3 AS ID, 'DDD' AS NAME FROM DUAL
    );
Azure SQL Database への変換

SSMA により次のように変換される。

INSERT SSMA.DML_TEST_001(ID, NAME)
   SELECT fci.ID, fci.NAME
   FROM 
      (
         SELECT 1 AS ID, 'AAA' AS NAME
          UNION ALL
         SELECT 2 AS ID, 'BBB' AS NAME
          UNION ALL
         SELECT 3 AS ID, 'DDD' AS NAME
      )  AS fci
GO

変換例 2 UPDATE 文

Oracle Database のコード
UPDATE  SSMA.dml_test_001
SET
    NAME = 'CCC'
WHERE 
    ID = 3;
Azure SQL Database への変換

SSMA により次のように変換される。

UPDATE SSMA.DML_TEST_001
   SET 
      NAME = 'CCC'
WHERE DML_TEST_001.ID = 3
GO

変換例 3 MERGE 文

Oracle Database のコード
MERGE INTO dml_test_002 tgt
USING dml_test_001 src 
ON ( tgt.id = src.id )
WHEN MATCHED THEN UPDATE
SET tgt.name = src.name
WHEN NOT MATCHED THEN
INSERT (
    tgt.id,
    tgt.name )
VALUES
    ( src.id,
      src.name );
Azure SQL Database への変換

SSMA により次のように変換される。

MERGE INTO SSMA.DML_TEST_002  AS TGT
   USING SSMA.DML_TEST_001  AS SRC
   ON(TGT.ID = SRC.ID)
   WHEN MATCHED THEN 
      UPDATE 
         SET 
            NAME = SRC.NAME
   WHEN NOT MATCHED BY TARGET 
      THEN INSERT (ID, NAME)
         VALUES (SRC.ID, SRC.NAME)
;
GO

変換例 4 DELETE 文

Oracle Database のコード
DELETE dml_test_002;
Azure SQL Database への変換

SSMA により次のように変換される。

DELETE SSMA.DML_TEST_002
GO

変換例 5 TRUNCATE 文

Oracle Database のコード
TRUNCATE TABLE dml_test_001;
Azure SQL Database への変換

SSMA により次のように変換される。

TRUNCATE TABLE SSMA.DML_TEST_001
GO

変換例 6 RETURNING 句 の利用

Oracle Database のコード
DECLARE
    v1 dml_test_001.ID%TYPE;
    v2 dml_test_001.NAME%TYPE;
BEGIN
    INSERT INTO dml_test_001(ID,NAME)
    VALUES(1, 'aaa')
    RETURNING ID, NAME INTO v1, v2;
    DBMS_OUTPUT.PUT_LINE('ID:' || v1 || ' NAME:' || v2);
END;
Azure SQL Database への変換

SSMA により次のように変換される。

BEGIN

   DECLARE
      @V1 numeric(38, 0), 
      @V2 nvarchar(50)

   DECLARE
      @temp_table TABLE 
      (
         V1 numeric(38, 0), 
         V2 nvarchar(50)
      )

   /*
   *   SSMA warning messages:
   *   O2SS0058: OUTPUT clauses might return different results in SQL Server when using triggers.
   */

   INSERT SSMA.DML_TEST_001(ID, NAME)
      OUTPUT INSERTED.ID, INSERTED.NAME
         INTO @temp_table(V1, V2)
      VALUES (1, 'aaa')

   SELECT @V1 = NULL, @V2 = NULL

   SELECT @V1 = V1, @V2 = V2
   FROM @temp_table

   PRINT 'ID:' + ISNULL(CAST(@V1 AS nvarchar(max)), '') + ' NAME:' + ISNULL(@V2, '')

END
GO
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?