2. 커서(CURSOR)
- 넓은 의미의 커서는 SQL명령의 영향을 받은 행들의 집합이고, 좁은의미로는 SELECT문의 결과 집합
을 의미
- 묵시적 커서(IMPLICITE CURSOR)와 명시적 커서(EXPLICITE CURSOR)
- 커서는 Query의 결과에 대하여 수정,삭제,검색 할 수 있도록 해주는 도구
- 개발자가 쿼리의 결과를 PL/SQL블록에서 수동으로 제한할 수 있도록 해줌
- 커서의 사용 단계
. 생성(선언영역) => OPEN (실행영역) => FETCH (실행영역 반복문 내부) => CLOSE (실행영역)
-- OPEN,CLOSE는 한 번 사용, OPEN을 했으면 꼭 CLOSE까지 해주어야 함
1)묵시적 커서
. 이름이 없는 커서로 일반적인 SELECT문의 결과 집합이 대표적인 묵시적 커서
. 묵시적 커서는 결과가 출력되는 순간 OPEN 되고 출력이 완료되면 자동으로 CLOSE됨
=>커서 내부에 접근이 불가능
❗커서속성
----------------------------------------------------------------------------------
속성 내용
----------------------------------------------------------------------------------
SQL%ISOPEN 커서가 OPEN 상태이면 true 반환(묵시적 커서는 항상 false) --커서를 만들 때 SQL 대신에 커서 이름을 넣으면 됨
SQL%NOTFOUND 커서 내부에 FETCH할 자료가 있으면 false, 없으면 true
SQL%FOUND 커서 내부에 FETCH할 자료가 없으면 false, 있으면 true
SQL%ROWCOUNT 커서 내부의 행의 갯수(결과의 수)
2)명시적 커서
.선언영역에서 이름을 부여하여 선언한 커서
3)선언형식
CURSOR 커서명 [(변수명 타입명,...)] IS
SELECT 문;
. '(변수명 타입명,...)' : 커서에서 사용될 자료를 전달받는 매개변수로 타입명 기술시 크기를
지정하지 않음
. 매개변수에 값은 OPEN문에서 설정 함
✔사용예)부서번호를 키보드로 입력 받아 해당 부서에 근무하는 직원들의 사원번호,사원명,입사일,직무코드를
출력하시오.
ACCEPT P_DCODE PROMPT '부서번호 입력(10~110) : ' -- ACCEPT 변수명 PROMPT 입력창 문구( ; 사용 X)
DECLARE -- SELECT문에서 가져오는 것들은 변수가 필요
L_EID HR.EMPLOYEES.EMPLOYEE_ID%TYPE; --데이터 타입이나 크기를 잘 모르 때 테이블 명으로 작성
L_ENAME VARCHAR2(80);
L_HDATE DATE;
L_JOB_ID HR.JOBS.JOB_ID%TYPE;
CURSOR CUR_EMP_NAME(DID HR.DEPARTMENTS.DEPARTMENT_ID%TYPE) IS -- OPEN 문의 변수는 ACCEPT 변수다
SELECT EMPLOYEE_ID,EMP_NAME,HIRE_DATE,JOB_ID
FROM HR.EMPLOYEES
WHERE DEPARTMENT_ID = DID;
BEGIN
END;
4) OPEN문
- 커서를 사용하기 위한 명령
(사용형식)
OPEN 커서명[(값1,...)]
. '(값1,...)' : 커서 선언문에 사용된 매개변수에 전달될 값을 기술
✔사용예)
ACCEPT P_DCODE PROMPT '부서번호 입력(10~110) : '
DECLARE
L_EID HR.EMPLOYEES.EMPLOYEE_ID%TYPE;
L_ENAME VARCHAR2(80);
L_HDATE DATE;
L_JOB_ID HR.JOBS.JOB_ID%TYPE;
CURSOR CUR_EMP_NAME(DID HR.DEPARTMENTS.DEPARTMENT_ID%TYPE) IS
SELECT EMPLOYEE_ID,EMP_NAME,HIRE_DATE,JOB_ID
FROM HR.EMPLOYEES
WHERE DEPARTMENT_ID = DID;
BEGIN
OPEN CUR_EMP_NAME(TO_NUMBER('&P_DCODE')); -- OPEN 커서명 + OPEN 문의 변수는 ACCEPT 변수다
END;
5)FETCH
. 커서 내의 자료를 읽어 블록에 가져오는 명령
. 보통 반복문 내부에 기술
(사용형식)
FETCH 커서명 INTO 변수 list;
- 커서 SELECT 문의 SELECT절에 기술된 컬럼들을 차례대로 '변수list'에 할당
- 커서 속성을 이용하여 반복문을 벗어날 수 있음
✔사용예)
ACCEPT P_DCODE PROMPT '부서번호 입력(10~110) : '
DECLARE
L_EID HR.EMPLOYEES.EMPLOYEE_ID%TYPE;
L_ENAME VARCHAR2(80);
L_HDATE DATE;
L_JOB_ID HR.JOBS.JOB_ID%TYPE;
CURSOR CUR_EMP_NAME(DID HR.DEPARTMENTS.DEPARTMENT_ID%TYPE) IS
SELECT EMPLOYEE_ID,EMP_NAME,HIRE_DATE,JOB_ID
FROM HR.EMPLOYEES
WHERE DEPARTMENT_ID = DID;
BEGIN
OPEN CUR_EMP_NAME(TO_NUMBER('&P_DCODE')); -- OPEN 커서명 + OPEN 문의 변수는 ACCEPT 변수다
DBMS_OUTPUT.PUT_LINE('부서번호 : '||'&P_DCODE');
DBMS_OUTPUT.PUT_LINE('================');
LOOP
FETCH CUR_EMP_NAME INTO L_EID,L_ENAME,L_HDATE,L_JOB_ID;
EXIT WHEN CUR_EMP_NAME%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('사원번호 : '||L_EID);
DBMS_OUTPUT.PUT_LINE('사원명 : '||L_ENAME);
DBMS_OUTPUT.PUT_LINE('입사일 : '||L_HDATE);
DBMS_OUTPUT.PUT_LINE('직무코드 : '||L_JOB_ID);
DBMS_OUTPUT.PUT_LINE('-------------------------------------');
END LOOP;
DBMS_OUTPUT.PUT_LINE('&P_DCODE'||'번부서 직원 수 : '||CUR_EMP_NAME%ROWCOUNT||'명');
DBMS_OUTPUT.PUT_LINE(' ');
END;
6) CLOSE
. OPEN된 커서는 CLOSE되어야 다시 OPEN 될 수 있음
(사용형식)
CLOSE 커서명;
'ORACLE 복습 & 정리' 카테고리의 다른 글
[ORACLE] 반복문 221201-03 (0) | 2022.12.01 |
---|---|
[ORACLE] 분기명령 221201-02 (0) | 2022.12.01 |
[ORACLE] PL/SQL 221130-04 (1) | 2022.11.30 |
[ORACLE] INDEX 221130-03 (0) | 2022.11.30 |
[ORACLE] SEQUENCE,동의어 221130-02 (0) | 2022.11.30 |