바닥코딩
cursor 본문
커서는 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 |