この記事では、Sql Server Migration Assistant (SSMA) for Oracle がカーソルを持つステートメントの一部を関数の戻り値の型として変換できない理由について説明します。
背景
カーソルは、ステートメントに名前 SELECT
を割り当て、その SQL ステートメント内の情報を操作できるメカニズムです。 カーソルは、データベース システム クエリによって返される個々の行を処理するために、データベース プログラマによって使用されます。
SSMA では、return ステートメント内のカーソルの変換はサポートされていません。 したがって、関数が戻り値の型としてカーソルで定義されている場合、SSMA はエラー メッセージを生成します。
例
関数func_name
を含むパッケージPackageName
を持つ次の例を考えてみましょう。 この関数は、パッケージ内で定義されているカーソル out_cursor
を返します。
CREATE OR REPLACE PACKAGE PackageName AS
TYPE Ref_cursor IS REF CURSOR RETURN emp%ROWTYPE;
FUNCTION func_name (choice INT) RETURN Ref_cursor;
END PackageName;
この関数は次のように定義されます。
CREATE OR REPLACE FUNCTION func_name (choice in INT)
RETURN PackageName.ref_cursor
AS
out_cursor PackageName.Ref_cursor;
BEGIN
IF choice = 1 THEN
OPEN out_cursor FOR SELECT * FROM emp WHERE comm IS NOT NULL;
ELSIF choice = 2 THEN
OPEN out_cursor FOR SELECT * FROM emp WHERE sal > 2500;
ELSIF choice = 3 THEN
OPEN out_cursor FOR SELECT * FROM emp WHERE deptno = 20;
END IF;
RETURN out_cursor;
END;
SSMA がこの関数を移行すると、次のエラーが生成されます。
O2SS0245: return ステートメントでの CURSOR 変換はサポートされていません
考えられる対処方法
可能な修復の 1 つは、カーソルを使用するのではなく、SQL Server の関数内に一時テーブルを作成して使用することです。 その後、この一時テーブルの参照が関数によって返されます。
次のように SQL Server コードを更新します。
CREATE FUNCTION dbo.func_name
(
@Choice int
)
RETURNS @TempEmp TABLE
(
[EMPNO] numeric(4, 0) NOT NULL,
[ENAME] varchar(10) NULL,
[JOB] varchar(9) NULL,
[MGR] numeric(4, 0) NULL,
[HIREDATE] datetime2(0) NULL,
[SAL] numeric](7, 2) NULL,
[COMM] numeric](7, 2) NULL,
[DEPTNO] numeric(2, 0) NULL,
[ROWID] uniqueidentifier NOT NULL
)
AS
BEGIN
IF (@Choice = 1)
BEGIN
INSERT INTO @TempEmp
SELECT *
FROM EMP where COMM is NOT NULL;
END
IF (@Choice = 2)
BEGIN
INSERT INTO @TempEmp
SELECT *
FROM EMP where sal > 2500;
END
IF (@Choice = 3)
BEGIN
INSERT INTO @TempEmp
SELECT *
FROM EMP WHERE deptno = 20;
END
RETURN;
END