일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- heapq
- B*Tree
- Oracle
- 로버트C마틴
- 오라클
- 데이터모델링
- table full scan
- 클린 코드
- leetcode215
- 조인
- SQLP
- RAC
- 리트코드215
- index fast full scan
- database
- 알고리즘
- SQLD
- 클린코드
- 오라클튜닝
- B*Tree인덱스
- 리눅스
- intellij
- join
- clean code
- 파이썬
- SQL튜닝의시작
- B*Tree인덱스구조
- 결합인덱스구조
- 친절한SQL튜닝
- db
- Today
- Total
개발노트
[PL/SQL] Cursor 본문
커서(Cursor)
Cursor 는 Oracle 서버에서 할당한 전용 메모리 영역에 대한 포인터이다.
질의의 결과로 얻어진 여러 행이 저장된 메모리상의 위치(포인터) 값이다.
커서는 Select 문의 결과 집합을 처리할 때 사용한다.
암시적 커서(Implicit Cursor)
오라클 DB에서 실행되는 모든 SQL문장은 암시적인 커서가 생성되며, 커서 속성을 사용할 수 있다.
모든 DML과 PL/SQL SELECT 문에 대해 선언된다.
암시적인 커서는 오라클이나 PL/SQL 실행 매커니즘에 의해 처리되는 SQL 문장이 처리되는 곳에 대한 익명의 주소이다.
Oracle 서버에서 SQL 문을 처리하기 위해 내부적으로 생성/관리한다.
암시적 커서는 SQL문이 실행되는 순간 자동으로 Open 과 Close 를 실행한다.
SQL 커서 속서을 사용하면 SQL문의 결과를 테스트할 수 있다.
암시적 커서의 속성
1) SQL%ROWCOUNT : SQL 문에 의해 반환된 결과 행 수(Number)
2) SQL%FOUND : SQL 문에 의해 반환된 총 행수가 1개 이상일 경우 True, 0개이면 False(Boolean)
3) SQL%NOTFOUND : SQL 문에 의해 반환된 행수가 없을 경우 TRUE
4) SQL%ISOPEN : 암시적 커서가 열려 있는지의 여부 검색, 항상 FALSE(PL/SQL 은 실행 후 바로 암시적 커서를 CLOSE 하기 때문에)
명시적 커서
프로그래머에 의해 선언되며 이름이 부여된 커서이다.
명시적 커서의 속성
1) %ROWCOUNT : 현재까지 반환된 모든 행의 수
2) %FOUND : FETCH 한 데이터가 행을 반환하면 TRUE
3) %NOTFOUND : FTCH한 데이터가 행을 반환하지 않으면 TRUE
4) %ISOPEN : 커서가 OPEN 되어 있으면 TRUE
커서 사용법
DECLARE 절에서 CURSOR를 선언한다.
FOR LOOP 을 사용하게 되면 행이 없을때까지 FETCH 를 진행하고, 따로 OPEN/FETCH/CLOSE 를 하지 않아도 된다. CLOSE 안쓰는 실수를 방지한다. 또한, ROWTYPE에 해당하는 변수를 따로 선언하지 않아도 된다. 이는 암시적으로 선언된다.
CURSOR FOR LOOP 은 사용법이 간단하고 메모리 관리도 편하기 때문에 제일 많이 사용하고 있다.
SET SERVEROUTPUT ON;
DECLARE
CURSOR C_EMP IS
SELECT *
FROM EMP
WHERE DEPTNO = 10;
BEGIN
FOR V_EMP IN C_EMP LOOP
DBMS_OUTPUT.PUT_LINE(V_EMP.EMPNO||'-'||V_EMP.NAME);
END LOOP;
END;
SET SERVEROUTPUT ON;
DECLARE
-- 커서 정의
CURSOR C_EMP IS
SELECT *
FROM EMP
WHERE DEPTNO = 10;
-- 커서의 행을 저장할 변수 정의
V_EMP EMP%ROWTYPE;
BEGIN
OPEN C_EMP;
LOOP -- 반복문
FETCH C_EMP INTO V_EMP;
EXIT WHEN C_EMP%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(V_EMP.EMPNO||'-'||V_EMP.NAME);
END LOOP;
CLOSE C_EMP;
END;
OPEN : 결과 행 집합을 식별
FETCH : 현재 행을 변수에 로드
CLOSE : 결과 행 집합 해제
'Database > Oracle' 카테고리의 다른 글
오라클 인덱스(Index) 구조 - B*Tree (0) | 2023.11.16 |
---|---|
계정 생성 (0) | 2023.04.04 |
Oracle RAC (0) | 2022.07.19 |
Instance 구성 (0) | 2022.07.19 |
Oracle 서버 기동 상태 (0) | 2022.07.19 |