오라클 PL/SQL 3. SQL Cursor Written by AngelaLEE 3 - 1 www.muhanedu.net SQL Cursor SQL 커서 소개 오라클 서버에서는 SQL 문을 실행할 때마다 처리(Parse, Execution)를 위한 메모리 공간, 즉 SQL 커서를 사용하게 된다. 이 메모리 공간은 Private SQL Area 라고도 불리우며, 오라클의 작업환경이 Dedicated Server 환경이냐 또는 MTS(Multi- Threaded Server)환경이냐에 따라 서버내에 위치되는 곳이 다르다. PL/SQL 블록이 실행될 때에도 내부에 포함된 SQL 문장에 대해 SQL 커서가 자동 적으로 생성되며, 필요에 따라서는 SQL 커서를 사용자가 선언하여 사용할 수도 있 다. SQL 커서의 유형에는 크게 묵시적 커서(Implicit Cursor)와 명시적 커서(Explicit Cursor)로 나누어진다1. 묵시적 커서는 오라클이 자동적으로 선언하여 사용한 후 자동적으로 정리(Clean-up) 해준다. 이에 반하여 명시적 커서는 사용자가 정의한 커서를 선언하여 사용하고, 커서의 사용이 끝난 후에는 별도의 정리(Clean-up) 작 업을 수행해줘야 한다. SQL 커서를 사용할 때, 커서는 임의의 커서 상수 값을 제공하는데, 이를 SQL 커서 속성(Cursor Attribute) 이라고 한다. 이 커서 속성은 커서의 유형에 따라 조금씩 다른 의미를 지니고 있음에 유의한다. 커서 속성에 대한 자세한 사항은 뒷부분에서 다루기로 한다. 1 보통 오라클에서는 ‘묵시적(Implicit)’ 이라는 단어의 의미는 ‘자동적이다’ 라는 의미를 내포하고 있으며, 이에 반하여 ‘명시적(Explicit)’ 의 의미는 ‘수동적이다’ 라는 의미를 내포하고 있다. 이 두 단어의 의미는 SQL 커서에서도 마찬가지로 사용되고 있다.
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
오라클 PL/SQL 3. SQL Cursor
Written by AngelaLEE 3 - 1 www.muhanedu.net
SQL Cursor
SQL 커서 소개
오라클 서버에서는 SQL문을 실행할 때마다 처리(Parse, Execution)를 위한 메모리
공간, 즉 SQL 커서를 사용하게 된다. 이 메모리 공간은 Private SQL Area 라고도
불리우며, 오라클의 작업환경이 Dedicated Server 환경이냐 또는 MTS(Multi-
Threaded Server)환경이냐에 따라 서버내에 위치되는 곳이 다르다.
PL/SQL 블록이 실행될 때에도 내부에 포함된 SQL 문장에 대해 SQL 커서가 자동
적으로 생성되며, 필요에 따라서는 SQL 커서를 사용자가 선언하여 사용할 수도 있
다.
SQL 커서의 유형에는 크게 묵시적 커서(Implicit Cursor)와 명시적 커서(Explicit
Cursor)로 나누어진다1. 묵시적 커서는 오라클이 자동적으로 선언하여 사용한 후
자동적으로 정리(Clean-up) 해준다. 이에 반하여 명시적 커서는 사용자가 정의한
커서를 선언하여 사용하고, 커서의 사용이 끝난 후에는 별도의 정리(Clean-up) 작
업을 수행해줘야 한다.
SQL 커서를 사용할 때, 커서는 임의의 커서 상수 값을 제공하는데, 이를 SQL 커서
속성(Cursor Attribute) 이라고 한다. 이 커서 속성은 커서의 유형에 따라 조금씩
다른 의미를 지니고 있음에 유의한다. 커서 속성에 대한 자세한 사항은 뒷부분에서
다루기로 한다.
1 보통 오라클에서는 ‘묵시적(Implicit)’ 이라는 단어의 의미는 ‘자동적이다’ 라는 의미를 내포하고 있으며, 이에 반하여 ‘명시적(Explicit)’ 의 의미는 ‘수동적이다’ 라는 의미를 내포하고 있다. 이 두 단어의 의미는 SQL 커서에서도 마찬가지로 사용되고 있다.
오라클 PL/SQL 3. SQL Cursor
Written by AngelaLEE 3 - 2 www.muhanedu.net
묵시적 커서(Implicit Cursor)
묵시적 커서는 오라클에서 자동적으로 선언해주는 SQL 커서로서, 사용자에게는 투
명하게 제공된다.
기본적으로 PL/SQL 블록내에서의 SELECT 문, DML(INSERT, UPDATE, DELETE) 문이
실행될 때마다 묵시적 커서가 선언된다. 여기에서 주의해야 할 점은 묵시적 커서의
경우 세션내에 단 한 개만이 선언되어 사용되었다가 문장이 종료됨과 동시에 정리
된다는 것이다. 그러므로 동시에 여러 개의 묵시적 커서가 사용되는 것이 아니라는
점이다.
묵시적 커서는 SQL 문의 실행된 결과를 커서 속성(Cursor Attribute)을 통해 제공
하고 있는데, 이는 가장 마지막에 실행된 SQL 문의 결과임에 주의한다. 커서 속성
에는 4 가지가 있는데, 묵시적 커서임을 나타내는 SQL%을 접두어(Prefix)로 사용한
다.
>> 묵시적 커서 속성(Cursor Attribute)
종류 설명
SQL%ROWCOUNT 가장 마지막에 실행된 SQL 문장이 처리한 데이터 행의 총 개수를 가지는 속성변수.
SQL%FOUND 가장 마지막에 실행된 SQL 문장이 처리한 데이터 행이 있을 경우에는 TRUE(참) 진리값을, 처리한 데이터 행이 없을 경우에는 FALSE(거짓) 진리값을 가지는 속성 Boolean변수.
SQL%NOTFOUND 가장 마지막에 실행된 SQL 문장이 처리한 데이터 행이 없을 경우에는 TRUE(참) 진리값을, 처리한 데이터 행이 있을 경우에는 FALSE(거짓) 진리값을 가지는 속성 Boolean변수.
SQL%ISOPEN 현재 묵시적 커서가 메모리에 확보되어 있을 경우에는 TRUE(참) 진리값을, 그렇지 않을 경우에는 FALSE(거짓) 진리값을 가지는 속성 Boolean변수. (단, 묵시적 커서는 문장이 실행 종료됨과 동시에 정리(Clean-up)되므로 이 커서속성은 항상 FALSE(거짓) 진리값을 가지게 됨에 주의한다.)
오라클 PL/SQL 3. SQL Cursor
Written by AngelaLEE 3 - 3 www.muhanedu.net
* 참고 :
SELECT 문장의 경우, 한 건의 데이터를 검색할 경우 이외에는 오라클 예외사
항(EXCEPTION)이 발생한다. 그러므로, SELECT 문장에 관련된 묵시적 커서의
경우에도 마찬가지로 한 건의 데이터를 처리하는 경우에만 정상적으로 사용
가능하다. 만약, 여러 개의 행이 검색될 경우에 처리를 정상적으로 하고자 한
다면, 명시적 커서(Explicit Cursor)를 사용하면 된다.
> EX:
VARIABLE del_cnt VARCHAR2(50)
DECLARE
V_DNO DEPT.DEPTNO%TYPE := &p_dno ;
BEGIN
DELETE EMP WHERE DEPTNO = V_DNO ;
:del_cnt := SQL%ROWCOUNT || ‘ 건 삭제되었습니다.’ ;
END;
PRINT del_cnt
오라클 PL/SQL 3. SQL Cursor
Written by AngelaLEE 3 - 4 www.muhanedu.net
명시적 커서(Explicit Cursor)
Introduction
명시적 커서는 필요에 따라 사용자가 선언하여 사용하는 SQL 커서 공간으로, 기본
적으로는 여러 개의 행을 처리하고 할 경우 사용된다. 여러 건을 검색하는
SELECT 문장의 경우 오라클은 예외사항(TOO_MANY_ROWS)을 발생하게 된다. 이
때, 오라클은 사용자가 정의한 명시적 커서 영역에 SELECT 문에 의해 검색된 여러
건의 데이터를 임시적으로 저장하고, 한 건씩 처리할 수 있도록 명시적 커서 기능
을 제공한다.
명시적 커서는 동시에 여러 개가 선언되어 사용될 수 있으며, 묵시적 커서와 마찬
가지로 커서 속성 변수를 제공한다. 하지만, 의미는 묵시적 커서와 약간씩 다르다.
명시적 커서는 여러 개가 선언될 수 있으므로, 커서 속성 변수는 ‘명시적 커서 명
(Cursor Name)%’을 커서 속성 변수의 접두어(Prefix)로 붙여서 사용한다.
>> 명시적 커서 속성(Cursor Attribute)
종류 설명
%ROWCOUNT FETCH 문에 의해 읽혀진 데이터의 총 건수를 가지는 속성변수.
%FOUND FETCH 문이 수행되었을 경우, 읽혀진(Fetch) 행이 있을 경우에는 TRUE(참) 진리값을, 그렇지 않을 경우에는 FALSE(거짓) 진리값을 가지는 속성 Boolean
%NOTFOUND FETCH 문이 수행되었을 경우, 읽혀진(Fetch) 행이 없을 경우에는 TRUE(참) 진리값을, 그렇지 않을 경우에는 FALSE(거짓) 진리값을 가지는 속성 Boolean
%ISOPEN 명시적 커서가 메모리에 확보(선언)되어 있을 경우에는 TRUE(참) 진리값을, 그렇지 않을 경우에는 FALSE(거짓) 진리값을 가지는 속성 Boolean변수.
오라클 PL/SQL 3. SQL Cursor
Written by AngelaLEE 3 - 5 www.muhanedu.net
Explicit Cursor 처리 단계
명시적 커서를 사용하기 위해서는 필수적으로 수행해야 할 4단계가 있다.
1. 명시적 커서 선언(Declaration)
2. 명시적 커서 열기(Open)
3. 명시적 커서로부터 처리할 데이터 행을 읽어오기(Fetch)
( 명시적 커서에 처리하고자 하는 데이터 행이 있다면, 처리가 완료
될 때까지 계속 읽는다.)
4. 명시적 커서의 데이터 행에 처리가 완료되었다면, 정리(Clean-up)작
업을 하기 위해 명시적 커서를 닫는다.(Close)
오라클 PL/SQL 3. SQL Cursor
Written by AngelaLEE 3 - 6 www.muhanedu.net
명시적 커서 선언(Declaration)
명시적 커서는 선언부(declare)에 다른 식별자와 마찬가지로 선언되며, 형
식은 아래와 같다. 주의해야 할 점은 명시적 커서가 선언부에 기술되어도
메모리 공간이 확보되는 것이 아니라 단지 정의만 이루어진다는 것이다.
> SYNTAX:
CURSOR cursor_name IS select-statement ;
cursor_name 명시적 커서의 이름으로 유일하게 명명되어야 한
다.
select-statement 기본적으로 명시적 커서는 여러 건을 검색하는
SELECT 문을 처리하기 위한 것이므로 처리하고자
하는 데이터를 검색하는 SELECT 문장을 이 부분에
기술하면 된다. 단, 주의해야 할 사항은 정의를 위
한 SELECT 문이므로 PL/SQL 블록의 SELECT~INTO
절과는 구분해야 한다. 즉, 명시적 커서를 정의할
때의 SELECT문은 INTO절을 가지지 않는다.
> EX:
DECLARE CURSOR emp_cur IS SELECT EMPNO, ENAME, SAL FROM EMP WHERE DEPTNO = 20;
CURSOR dept_emp IS SELECT D.DNAME, E.ENAME FROM EMP E, DEPT D WHERE E.DEPTNO = D.DEPTNO AND E.ENAME LIKE ‘%A%’ ;
....
BEGIN
....
오라클 PL/SQL 3. SQL Cursor
Written by AngelaLEE 3 - 7 www.muhanedu.net
명시적 커서 열기(Open)
명시적 커서가 사용되기 위해서는 메모리 공간이 확보되어야 하는데, 바로
커서 열기(Open)를 통해 이루어진다.
커서를 열게 되면, 선언부에서 정의된 커서의 SELECT 문이 실행되면서 해당
데이터들(Active Set)이 명시적 커서 영역에 자리잡게 된다. 즉 SELECT 문
에 의해 메모리 공간 크기가 결정되는 것이다.
이때, 명시적 커서 영역에 자리잡은 데이터의 첫번째 행에 커서 포인터
(pointer)가 위치한다. 바로 이 포인터 위치의 데이터 행을 FETCH 문이 읽
게 된다.
> SYNTAX:
OPEN cursor_name ;
cursor_name 열고자 하는 명시적 커서의 이름으로 선언부에 선
언된 커서명중에 하나이어야 한다.
QUIZ:
명시적 커서가 열릴 때, SELECT 문의 결과 행이 한 건
도 없었다면 정상적으로 명시적 커서가 열리는가 ?
오라클 PL/SQL 3. SQL Cursor
Written by AngelaLEE 3 - 8 www.muhanedu.net
> EX:
DECLARE
CURSOR emp_cur IS SELECT EMPNO, ENAME, SAL FROM EMP WHERE DEPTNO = 20;
CURSOR dept_emp IS SELECT D.DNAME, E.ENAME FROM EMP E, DEPT D WHERE E.DEPTNO = D.DEPTNO AND E.ENAME LIKE ‘%A%’ ;
....
BEGIN
OPEN emp_cur ;
OPEN dept_emp ;
....
END;
오라클 PL/SQL 3. SQL Cursor
Written by AngelaLEE 3 - 9 www.muhanedu.net
명시적 커서로부터 데이터 읽기(Fetch)
명시적 커서의 데이터들(Active Set)로부터 데이터를 한 건씩 읽어오기 위
해서 FETCH 문을 사용한다. 이때 읽게 되는 데이터 행은 포인터(Pointer)에
의해서 지정된다.
FETCH 가 되면 자동적으로 포인터는 다음 행에 위치하게 된다. FETCH 후
데이터가 정상적으로 검색되었는지를 판단하기 위
해 %FOUND, %NOTFOUND 와 같은 커서 속성 변수를 사용한다.
데이터들을 읽어 처리하기 위해서 FETCH문은 반복문과 함께 사용한다.
SELECT~INTO절과 마찬가지로 FETCH문도 INTO절을 갖는다.
> SYNTAX:
FETCH cursor_name INTO variable ;
cursor_name 읽어(Fetch) 오고자 하는 명시적 커서의 이름으로
반드시 open 되어야 한다.
Variable 명시적 커서로부터 읽어온(Fetch) 데이터 행(레코
드)을 PL/SQL 블록내에서 처리하기 위해서는 변수
에 저장해야 한다. 이때 variable 에는 단순변수
또는 복합변수가 올 수 있으며, 기본적으로 선언부
에 선언되어야만 한다. 만약 단순변수를 사용한다
면, 커서에서 정의된 SELECT 리스트의 개수 만큼
선언하고 SELECT 리스트의 위치대로 FETCH 의
INTO 절에 차례대로 기술한다. 만약 복합변수를
사용한다면, 커서 레코드 변수(커서명%ROWTYPE)
를 선언하여 사용한다.
오라클 PL/SQL 3. SQL Cursor
Written by AngelaLEE 3 - 10 www.muhanedu.net
> EX:
DECLARE
CURSOR emp_cur IS SELECT EMPNO, ENAME, SAL FROM EMP WHERE DEPTNO = 20;
CURSOR dept_emp IS SELECT D.DNAME, E.ENAME FROM EMP E, DEPT D WHERE E.DEPTNO = D.DEPTNO AND E.ENAME LIKE ‘%A%’ ;