바닥코딩

cursor 본문

데이터 베이스/오라클 PLSQL

cursor

개발공부개발공부 2021. 3. 24. 11:11

 커서는 DB서버에 저장되어 있는 특정 쿼리를 실행하기 위한 정보를 저장하는 PGA 에 대한 포인터로, 클라이언트 메모리에 존재하는 자료구조 입니다. 지금까지 짧게나마 pl/sql 문법과 얘재들을  살펴보면서 커서라는 개념을 접한적은 없었습니다. 그런데 과연 꼭 커서를 알거나 사용할 필요가 있나 의문이 들 수 있습니다.

 결론적으로 말하자면 PL/SQL은 커서 없이는 쿼리를 실행할 수 없습니다. 지금까지 했던 예제들은 따로 커서를 명시해 주지는 않았지만, 묵시적으로 커서가 사용된 것이며 물론 명시적으로도 커서를 사용할 수 있습니다. 

 묵시적 커서, 명시적 커서

비교항목  묵시적 커서  명시적 커서 
커서 선언 없음 있음
복잡도 단순 복잡
커서 제어 불가능 가능
유연성 낮음 높음
사용가능 SQL SELECT, INSERT, UPDATE, DELETE, MERGE SELECT
커서 속성 참조 SQL%커서속성 커서명%커서속성
전형적 사용방법 즉시실행 OPEN , FETCH , CLOSE

 위와 같이 묵시적 커서는 명시적 커서에 비해 사용방법이 훨씬 단순합니다. 하지만 프로그램 실행 즉시 자동적으로 수행이 되기 떄문에 커서에 대한 제어를 할 수 없다는 특징이 있습니다. 반면에 명시적 커서는 OPEN - FETCH -CLOSE 문법에 의해 순차적으로 진행이 되기 때문에 제어가 가능하며 제어가 가능하다는 의미는 유연성이 높다는 장점이 연결됩니다.

DECLARE
    v_name emp.ename%TYPE;
begin
---------<-- 묵시적 커서 수행
    select ename
     into v_name
    from emp
    where empno = '7788';

    DBMS_OUTPUT.PUT_LINE('ENAME = '|| v_name);
end;

위에 코드를 확인해보면 따로 커서에 대한 선언이 존재하지는 않습니다 그렇지만, PL/SQL의 엔진은 묵시적으로 커서를 생성하여 SELECT 문을 처리하게 됩니다(묵시적 커서).

 명시적 커서는 DECLARE 절에 CURSOR 선언을 가지고 시작하며 SELECT문에서만 사용이 가능합니다. 보통 한 개 이상의 많은 결과 로우를 반환할 떄 사용하게 되며 보통 두가지 방식으로 사용합니다

  • OPEN문을 사용하여 커서를 열고 FETCH로 결과를 추출 CLOSE로 커서를 닫는다
  • FOR LOOP문에서 사용한다
declare
    v_name emp.ename%Type;

    cursor ename_cursor is -- DECLARE 절 커서 명시
        select ename
        from emp
        where empno = 7788;  -- 커서를 지정하다
begin
    open ename_cursor;  -- 커서 오픈

    fetch ename_cursor -- 커시 실행 block
     into v_name;
    Dbms_output.PUT_LINE('ename =' || v_name);

    close ename_cursor; -- 커서 닫기
end;

  위에 예제를 보면 DECLARE 절에서 ename_cursor이라는 커서를 지정하고 커서에 해당하는 정적 SQL을 할당 했습니다. 그런 다음 FETCH 문을 사용하여 해당 쿼리에서 결과를 가져와 PL/SQL 변수에 담아 줍니다  그 이후 CLOSE를 통해 커서를 닫아 주는데 커서를 닫지 않았을 경우 성능저하나, 커서 공간이 부족해지는 문제가 발생할 수 있는 경우가 있기 떄문에 꼭 커서를 사용후에는 닫아주어야 합니다

 

 

 

 

 

'데이터 베이스 > 오라클 PLSQL' 카테고리의 다른 글

트리거  (0) 2021.03.24
PL/SQL 컬렉션  (0) 2021.03.24
순환문  (0) 2021.02.25
분기문  (0) 2021.02.25
PL/SQL에서 일반 SQL 실행  (0) 2021.02.25