SQL 커서
: SQL문을 실행할 때마다 데이터 처리(Parse, Execution)를 위한 메모리 공간
사용자가 요청하는 데이터를 DB 버퍼 캐쉬->커서로 복사해 온 후 커서에서 원하는 데이터를 추출(Fetch)해 후속작업을 함 (임시저장소의 개념)
- 묵시적 커서 (Implicit Cursor) -자동
- 명시적 커서 (Explicit Cursor) -사용자 정의
- 묵시적 커서
- 필요한 경우 오라클이 자동적으로 선언해 사용 후 자동적으로 정리(사용자는 생성 유무 알 수 X)
- PL/SQL 블록이 실행될 때, 내부에 포함된 SQL 문장에 대해 SQL 커서가 자동 생성
- PL/SQL 블록 내에서, SELECT과 DML문이 실행될 때마다 묵시적 커서 선언
- 세션 내에 단 한개만 선언되어 사용되었다가 문장이 종료됨과 동시에 정리
** 1행의 데이터만 저장 가능
- 명시적 커서
- 사용자가 정의한 커서를 선언하여 생성후 사용하고 사용이 끝난 후에는 정리 작업 수행 필수
- 여러 개의 행을 처리 가능
묵시적 커서 속성 변수
- SQL%ROWCOUNT : 해당 커서에서 실행한 총 행의 개수 반환(마지막 행의 수를 반환)
- SQL%FOUND : 해당 커서 안에 수행해야 할 데이터가 있을 경우 T, 없을 경우 F 반환
-SQL%NOTFOUND : 해당 커서 안에 수행해야 할 데이터가 없을 경우 T, 있을 경우 F 반환
-SQL%ISOPEN : 묵시적 커서가 메모리에 오픈되어 있을 경우 T, 아닌 경우 F 값을 가짐
명시적 커서 속성 변수
여러 개가 선언될 수 있어 커서명%속성변수 로 사용
- 커서이름%ROWCOUNT : FETCH문에 의해 읽혀진 데이터의 총 행 수를 가짐(마지막에 처리된 행의 수를 반환)
- 커서이름%FOUND : FETCH문이 수행되었을 경우, 읽혀진(FETCH)행이 있을 경우 T, 없는 경우 F을 가짐
- 커서이름%NOTFOUND : FETCH 문이 수행되었을 경우, 읽혀진(Fetch) 행이 없을 경우 T, 있는 경우 F을 가짐
- 커서이름%ISOPEN : 명시적 커서가 메모리에 확보(선언)되어 있을 경우 T, 아닌 경우 F을 가짐
명시적 커서 처리 단계

1) 명시적 커서 선언(Declaration)
- 선언부에 선언 필수(커서를 사용하겠다라고 알려주는 역할, 실제 메모리 할당은 X)
- 커서명 : 명시적 커서의 이름
- 서브 쿼리 : 처리하려는 데이터의 SELECT문

2) 명시적 커서 열기(Open)
- 서브쿼리를 수행해서 데이터를 커서로 가져옴(메모리에 커서가 사용할 메모리 공간이 할당됨)
- 명시적 커서 영역의 데이터 첫 번째 행에 커서 포인터(pointer)가 설정 -> 포인터 위치의 데이터 행을 다음 단계인 FETCH에서 읽어들임

3) 명시적 커서에서 데이터 읽어서 변수로 할당(Fetch)
- 명시적 커서의 데이터들(Active Set)로부터 데이터를 한 건씩 읽어 변수로 할당하기 위해 FETCH 문 사용
- 포인터에 의해 지정된 데이터 행을 읽음(Fetch) -> 자동으로 포인터는 다음 행으로 이동
- 명시적 커서에는 데이터가 여러 건 들어있어 FETCH문과 반복문을 함께 사용해 데이터를 읽고 처리함

- FETCH ~ INTO : FETCH 후 변수에 값을 할당함
- 커서는 반드시 open 되어있어야 Fetch 가능
- 변수들 : 명시적 커서로부터 읽어온(Fetch) 데이터 행(레코드)을 PL/SQL 블록 내에서 처리하기 위해 저장할 변수
cf) 선언부에 변수 선언 필수(단순/복합 변수 가능)
단순 변수 : 커서에서 정의된 SELECT 리스트의 개수만큼 선언하고 SELECT 리스트의 위치대로 FETCH 의 INTO 절에 차례 대로 적어야 함
복합 변수 : 커서 레코드 변수(커서명%ROWTYPE)를 선언하여 사용
4) 명시적 커서 닫기(Close)
- 명시적 커서가 다 사용된 후에 커서를 닫아주는 명령어
cf) 작업이 끝난 메모리 공간을 반환하고 정리(닫지 않으면 메모리 낭비, 동일한 커서를 다른 PL/SQL BLOCK에서 동일한 이름의 커서를 사용하면 에러 발생)

cf) PL/SQL 블록 내에서 Close 된 커서를 접근하게 되면 오라클은 예외(INVALID_CURSOR)를 발생

