次の方法で共有


O2SS0245: return ステートメントでの CURSOR 変換がサポートされていません (エラー)

この記事では、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