꺄르륵
[Oracle SQL Developer] 기초 XXV - CURSOR 본문
1. 커서(CURSOR)
1.1. 설명
- 쿼리의 수행으로 영향을 받는 행들의 집합
- 보통 SELECT 문의 수행 결과 집합에 대하여 개별적인 행단위 작업을 수행하기 위해 사용한다.
- 쿼리의 결과 집합에 대해 첫 행부터 마지막 행까지 자동적으로 참조한다.
- 선택된 행들은 서버 상에서 개별적으로 처리된다.
- 개발자가 PL/SQL 블럭에서 수동으로 제어가 가능하다. ( 커서 생성 → OPEN → FETCH → CLOSE )
1.2. 종류
(1) 묵시적 커서
- 커서를 명시적으로 생성하지 않은 쿼리 수행시 자동적으로 생성되는 커서
- 결과가 도출되는 시점에서 OPEN 되고 결과의 출력이 끝나면 CLOSE 된다.
- 커서 속성
- 앞에 SQL 이 붙으면 묵시적 커서라는 뜻이고 그 외의 커서는 커서의 이름으로 설정한다.
-------------------------------------------------------------------------------------------------------
커서 속성 내용
-------------------------------------------------------------------------------------------------------
SQL%ISOPEN 항상 FALSE
SQL%NOTFOUND SQL 문장이 어떠한 영향도 미치지 않았다면 TRUE
SQL%FOUNT SQL 문장이 하나 이상의 행에 영향을 미쳤다면 TRUE
SQL%ROWCOUNT SQL 문장에 의하여 영향받은 행의 수
-------------------------------------------------------------------------------------------------------
EX)
DECLARE
V_NAME LPROD.LPROD_NM%TYPE;
BEGIN
SELECT LPROD_NM INTO V_NAME
FROM LPROD
WHERE LPROD_ID = 'P102';
IF SQL%FOUND THEN
DBMS_OUTPUT.PUT_LINE('결과 자료 수 : ' || SQL%ROWCOUNT);
END IF;
END;
EX) 사원테이블에서 부서번호 50번 사원의 급여를 모두 1000만큼 인상하시오.
SELECT * FROM EMP WHERE DEPARTMENT_ID = 50;
DECLARE
V_DEPT_ID EMP.DEPARTMENT_ID%TYPE := 50;
BEGIN
UPDATE EMP
SET SALARY = SALARY + 1000
WHERE DEPARTMENT_ID = V_DEPT_ID;
DBMS_OUTPUT.PUT_LINE('갱신된 레코드 수 : ' || SQL%ROWCOUNT);
END;
(1) 명시적 커서
- 사용자가 직접 생성한 커서(선언부에서 정의)
- 커서 선언 → 커서 OPEN → FETCH 및 사용 → 커서 CLOSE
1) CURSOR 선언
CURSOR 커서명[(매개변수, 매개변수, ...)]
IS
SELECT 문;
2) CURSOR OPEN
- 해당 커서를 생성과 OPEN
OPEN 커서명[(값LIST)]; -- 전달해주는 값이 똑같이 MAPPING 되어야한다. = 위치, 타입, 개수가 같아야된다.
3) FETCH 및 사용
- 커서의 해당 위치의 행을 참조한다.
- READ 명령과 유사하다.
LOOP
FETCH 커서명 INTO 변수명, 변수명, ...
EXIT WHEN 커서명%NOTFOUND
[처리문;]
END LOOP;
. '변수명, 변수명' : 커서에 포함된 열의 값을 할당 받을 변수
4) CURSOR CLOSE
- 사용이 종료된 커서를 CLOSE 한다.
CLOSE 커서명;
EX) EMP 테이블에서 사원들의 이름만 추출해주는 커서를 SELECT 문으로 커서를 만듦.
DECLARE
V_EMP_NAME EMP.EMP_NAME%TYPE;
V_SALARY EMP.SALARY%TYPE;
-- 1. 커서를 생성 및 선언
CURSOR CUR_EMP(C_DEPT_ID EMP.DEPARTMENT_ID%TYPE)
IS
SELECT EMP_NAME, SALARY
FROM EMP
WHERE DEPARTMENT_ID = C_DEPT_ID;
BEGIN
-- 2. 커서를 OPEN
OPEN CUR_EMP(50);
LOOP
-- 3. FETCH를 실행
FETCH CUR_EMP INTO V_EMP_NAME, V_SALARY;
EXIT WHEN CUR_EMP%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(V_EMP_NAME || ', ' || V_SALARY);
END LOOP;
DBMS_OUTPUT.PUT_LINE('사원수 : ' || CUR_EMP%ROWCOUNT);
-- 4. 커서를 CLOSE
CLOSE CUR_EMP;
END;
'프로그래밍 > DB' 카테고리의 다른 글
ERWIN_테이블 스크립트로 erd 그리기 (0) | 2021.12.28 |
---|---|
[Oracle SQL Developer] 기초 XXIV - LOOP (0) | 2019.10.29 |
[Oracle SQL Developer] 기초 XXIII - PL/SQL 변수 (0) | 2019.10.29 |
[Oracle SQL Developer] 기초 XXI - PL/SQL (0) | 2019.10.29 |
[Oracle SQL Developer] 기초 XX - SYNONYM 객체 (0) | 2019.10.29 |