21장 커서 사용하기

커서 이해하기

SQL 검색 작업은 이라 부르는 여러 행을 반환한다. 간혹 행을 앞뒤로 이동하며 데이터를 가져올 필요가 있는데 이때 커서를 사용할 수 있다.

커서는 DBMS 서버에 저장된 쿼리로 SELECT 문은 아니지만, SELECT 문으로 가져온 결과 집합이다. 커서는 한 번 저장되면, 프로그램에서 필요할 때마다 데이터를 상하로 탐색하면서 검색 결과를 가져올 수 있다.

DBMS마다 다르지만 일반적으로 자주 사용하는 옵션과 기능이다.

  • 커서에 읽기 전용으로 표시하여, 데이터를 읽을 수 있지만 업데이트나 삭제하지 못하게 하는 기능

  • 방향과 위치를 제어할 수 있는 기능

  • 특정한 열만 수정할 수 있게 표시하고, 그 외 열은 수정하지 못하게 하는 기능

  • 커서를 특정한 요청이나 모든 요청에 접근할 수 있게 하는 범위 지정 기능

  • DBMS에서 가져온 데이터를 복사하여 커서가 연 후 데이터를 사용하는 사이에 데이터가 변경되지 않게 하는 기능

커서는 사용자가 화면의 데이터를 위, 아래로 탐색하며 필요에 따라 변경할 수 있는 대화형 프로그램에서 자주 사용한다.

커서 사용하기

커서는 다음과 같은 방식으로 사용된다.

  • 커서는 반드시 사용하기 전에 선언하여야 한다. 실제 데이터를 가져오진 않고, 사용할 SELECT 문과 커서 옵션을 정의한다.

  • 선언된 커서를 사용하려면, 커서를 열어야 한다. 그러면 이전에 정의한 SELECT 문으로 데이터를 가져온다.

  • 필요시 데이터를 가진 커서에서 개별 행을 가져온다.

  • 커서를 다 사용했으면 커서를 닫고, 가능하면 해제시켜야 한다.

한번 커서를 선언하면 필요시 몇 번이고 다시 열고 닫을 수 있다. 또한 커서를 한 번 열면 그 안의 데이터를 몇 번이고 가져올 수 있다.

커서 만들기

커서는 DECLARE 문을 사용해 만들 수 있다. (DBMS마다 다르다.) DECLARE로 커서 이름을 선언한 다음 SELECT 문을 선언한다. 필요에 따라 WHERE 절이나 다른 절을 사용할 수도 있다. 예시를 보자.

-- Oracle, PostgreSQL
DECLARE CURSOR CustCursor
IS
SELECT * FROM Customers
WHERE cust_email IS NULL;

-- Db2, MariaDB, MySQL, SQL Server
DECLARE CustCursor CURSOR
FOR
SELECT * FROM Customers
WHERE cust_email IS NULL;

커서가 정의 되었다. 사용해보자.

커서 사용하기

커서는 OPEN CURSOR 문으로 동작한다.

OPEN CURSOR CustCursor

이제 FETCH 문으로 데이터에 접근할 수 있다. FETCH는 어떤 행을 가져올지, 어디서부터 가져올지, 어디에 저장할지를 정의한다.

-- 커서에서 맨 위에 있는 한 행을 가져오는 Oracle 문법
DECLARE TYPE CustCursor IS REF CURSOR 
    RETURN Customers%ROWTYPE;
DECLARE CustRecord Customers%ROWTYPE
BEGIN
    OPEN CustCursor;
    FETCH CustCursor INTO CustRecord;
    CLOSE CustCursor;
END;
-- FETCH는 현재 행을 가져와 CustRecord라는 변수에 저장한다.


-- 커서의 첫 번째 행부터 마지막 행까지 루프를 도는 Oracle 문법
DECLARE TYPE CustCursor IS REF CURSOR
    RETURN Customers%ROWTYPE;
DECLARE CustRecord Customers%ROWTYPE
BEGIN
    OPEN CustCursor;
    LOOP
    FETCH CustCursor INTO CustRecord;
    EXIT WHEN CustCursor%NOTFOUND;
    ...
    END LOOP;
    CLOSE CustCursor;
END;
-- FETCH는 LOOP 내에서 현재 행을 가져오는 것을 반복한다.
-- EXIT WHEN... 코드는 더 가져올 행이 없을 때 루프를 빠져나가게 한다.

커서 닫기

사용이 끝난 커서는 닫아야 한다. 뿐만 아니라 SQL Server 같은 일부 DBMS는 커서가 사용한 리소스를 명시적으로 해제해야 한다.

-- Oracle, Db2, PostgreSQL
CLOSE CustCursor

-- Microsoft SQL Server
CLOSE CustCursor
DEALLOCATE CURSOR CustCursor

정리하기

  • 커서의 정의와 사용 이유

  • 커서 사용법

Last updated

Was this helpful?