이 문서에서는 커서 또는 커서 변수가 함수 또는 프로시저 호출에 매개 변수로 전달될 때 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 코드에서 다음 수정을 수행할 수 있습니다.
SSMA는 Oracle 프로시저를 Transact-SQL로 변환하면 형식
varchar(8000)
을CURSOR (@emp_refcur)
.로 변환합니다. 그러나 SQL Server에서는 다음과 같은 방법으로@emp_refcur Cursor Varying OUTPUT
매개 변수로OUTPUT
커서 데이터 형식을 선언할 수 있습니다.또한 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