概要
本記事の位置付けについて
Oracle Database から Azure SQL Database へ SQL Server Migration Assistant for Oracle (SSMA)によるプログラム移行検証結果の一部である。次の記事にて個別機能別記事へのリンクを整理している。
変数と定数について
Oracle Database では、変数と定数を定義できる。定数について、Oracle Database ドキュメントにて、次のように記載されている。
変更されない値を保持します。
%TYPE 属性や%ROWTYPE 属性を指定することで、定義済みのデータ型などを再利用することができる。
%ROWTYPE属性を使用すると、データベースの表またはビュー内の行の全体または一部を表すレコードを宣言できます。
引用元:1.2.8.3 %ROWTYPE属性の使用 (oracle.com)
%TYPE属性を使用すると、事前に宣言されている変数または列と同じデータ型のデータ項目を(データ型を知らなくても)宣言できます。
引用元:1.2.8.4 %TYPE属性の使用 (oracle.com)
参考リンク
特になし。
Azure SQL Database への移行
SSMA による変換
Azure SQL ファミリーでは、定数をサポートしていないため、変数に変換される。%TYPE 属性と%ROWTYPE 属性に相当する機能がないため、参照元のデータ型などを静的なコードに変換される。
移行方針
特になし。
変換例
変換例 1 変数
Oracle Database のコード
DECLARE
var NUMBER(10,0) :=10;
BEGIN
var := 100;
DBMS_OUTPUT.PUT_LINE(var);
END;
Azure SQL Database への変換
SSMA により次のように変換される。
BEGIN
DECLARE
@VAR numeric(10, 0) = 10
SET @VAR = 100
PRINT @VAR
END
GO
変換例 2 定数
Oracle Database のコード
DECLARE
CONST_NUM CONSTANT NUMBER(10,0) := 12;
BEGIN
DBMS_OUTPUT.PUT_LINE(CONST_NUM);
END;
Azure SQL Database への変換
SSMA により次のように変換される。
BEGIN
DECLARE
@CONST_NUM numeric(10, 0) = 12
PRINT @CONST_NUM
END
GO
変換例 3 %TYPE 属性
Oracle Database のコード
DECLARE
var HR.departments.manager_id%TYPE;
BEGIN
select manager_id INTO var from HR.departments WHERE department_id = 90;
DBMS_OUTPUT.PUT_LINE(var);
END;
Azure SQL Database への変換
SSMA により次のように変換される。
BEGIN
DECLARE
@VAR numeric(6, 0)
SELECT @VAR = DEPARTMENTS.MANAGER_ID
FROM HR.DEPARTMENTS
WHERE DEPARTMENTS.DEPARTMENT_ID = 90
PRINT @VAR
END
GO
変換例 4 %ROWTYPE 属性
Oracle Database のコード
DECLARE
d_row HR.departments%ROWTYPE;
BEGIN
SELECT * INTO d_row FROM HR.departments WHERE department_id = 90;
DBMS_OUTPUT.PUT_LINE(d_row.MANAGER_ID);
END;
Azure SQL Database への変換
SSMA のプロジェクト設定値であるConvert record as a list of separates variables
がYES
の場合に、SSMA により次のように変換される。
BEGIN
DECLARE
@D_ROW$DEPARTMENT_ID numeric(4, 0),
@D_ROW$DEPARTMENT_NAME varchar(30),
@D_ROW$MANAGER_ID numeric(6, 0),
@D_ROW$LOCATION_ID numeric(4, 0)
SELECT @D_ROW$DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID, @D_ROW$DEPARTMENT_NAME = DEPARTMENTS.DEPARTMENT_NAME, @D_ROW$MANAGER_ID = DEPARTMENTS.MANAGER_ID, @D_ROW$LOCATION_ID = DEPARTMENTS.LOCATION_ID
FROM HR.DEPARTMENTS
WHERE DEPARTMENTS.DEPARTMENT_ID = 90
PRINT @D_ROW$MANAGER_ID
END
GO