다음을 통해 공유


O2SS0264: 커서 또는 커서 변수를 함수 또는 프로시저 호출 매개 변수로 변환할 수 없음(오류)

이 문서에서는 커서 또는 커서 변수가 함수 또는 프로시저 호출에 매개 변수로 전달될 때 Oracle용 SSMA(SQL Server Migration Assistant)가 PL/SQL 블록을 변환하지 않는 이유를 설명합니다.

배경

커서는 문에 이름을 할당하고 해당 SQL 문 내의 정보를 조작할 SELECT 수 있는 메커니즘입니다. 커서는 데이터베이스 프로그래머가 데이터베이스 시스템 쿼리에서 반환된 개별 행을 처리하는 데 사용됩니다. Oracle SYS_REFCURSOR 에서는 저장 프로시저에서 커서를 전달하는 데 사용됩니다.

커서 또는 커서 변수가 함수 또는 프로시저 호출에 매개 변수로 전달되면 SSMA는 해당 문을 변환할 수 없으며 오류 메시지를 생성합니다.

예시

다음 예제에서는 변수를 다음과 같이 SYS_REFCURSOR선언합니다.

CREATE OR REPLACE PROCEDURE p_close_refcursor
(
    emp_refcur OUT SYS_REFCURSOR
)
AS
    test_cursor SYS_REFCURSOR;
    departmentno dept.deptno%TYPE;
BEGIN
    OPEN
        test_cursor
    FOR
        SELECT deptno
        FROM dept;

    LOOP
        FETCH test_cursor
        INTO departmentno;

        EXIT WHEN test_cursor%NOTFOUND;

        DBMS_OUTPUT.PUT_LINE(departmentno);
    END LOOP;

    emp_refcur := test_cursor;

    CLOSE test_cursor;
END;

그런 다음 이 프로시저를 호출하여 커서를 검색하는 형식 SYS_REFCURSOR 의 변수를 전달합니다.

DECLARE
    emp_cur SYS_REFCURSOR;
BEGIN
    p_close_refcursor(emp_cur);
END;

SSMA에서 이전 코드를 변환하려고 하면 다음 오류 메시지가 생성됩니다.

O2SS0264: 커서 또는 커서 변수를 함수 또는 프로시저 호출 매개 변수로 변환할 수 없음

가능한 해결 방법

이 오류를 해결하려면 먼저 SSMA를 사용하여 프로시저(P_CLOSE_REFCURSOR)를 Transact-SQL로 변환하고 SQL 코드에서 다음 수정을 수행할 수 있습니다.

  1. SSMA는 Oracle 프로시저를 Transact-SQL로 변환하면 형식varchar(8000)CURSOR (@emp_refcur) .로 변환합니다. 그러나 SQL Server에서는 다음과 같은 방법으로 @emp_refcur Cursor Varying OUTPUT매개 변수로 OUTPUT 커서 데이터 형식을 선언할 수 있습니다.

  2. 또한 SSMA는 값을 사용하여 변수 @emp_refcur (형식 varchar(8000)) NULL 를 초기화합니다. 따라서 형식을 변경한 후 문을 SET @emp_refcur = NULL주석으로 처리하여 이 초기화를 제거해야 합니다.

다음과 같이 SQL Server Transact-SQL 코드를 업데이트합니다.

CREATE PROCEDURE dbo.P_CLOSE_REFCURSOR
    @emp_refcur Cursor Varying OUTPUT
AS
BEGIN
    -- SET @emp_refcur = NULL

    DECLARE
         @test_cursor CURSOR,
         @departmentno float(53)

    SET @test_cursor =
        CURSOR FOR
            SELECT DEPT.DEPTNO
            FROM dbo.DEPT

    OPEN @test_cursor

    WHILE 1 = 1
    BEGIN
        FETCH @test_cursor
        INTO @departmentno

        IF @@FETCH_STATUS <> 0
            BREAK

        PRINT @departmentno
    END

    SET @emp_refcur = @test_cursor

    CLOSE @test_cursor
    DEALLOCATE @test_cursor
END

이제 다음 코드를 사용하여 커서 변수를 전달하여 이전 프로시저를 호출할 수 있습니다.

DECLARE @cursor_variable CURSOR
EXECUTE dbo.P_CLOSE_REFCURSOR @cursor_variable