커서란?
SELECT INTO 방식
// 기본 형식
SELECT 열1, 열2, ..., 열n INTO 변수1, 변수2, ..., 변수n
FROM ...
///
```sql
// SELECT INTO를 사용한 단일행 데이터 저장하기
DECLARE
V_DEPT_ROW DEPT%ROWTYPE;
BEGIN
SELECT DEPTNO, DNAME, LOC INTO V_DEPT_ROW
FROM DEPT
WHERE DEPTNO = 40;
DBMS_OUTPUT.PUT_LINE('DEPTNO : ' || V_DEPT_ROW.DEPTNO);
DBMS_OUTPUT.PUT_LINE('DNAME : ' || V_DEPT_ROW.DNAME);
DBMS_OUTPUT.PUT_LINE('LOC : ' || V_DEPT_ROW.LOC);
END;
/
명시적 커서
단계 | 명칭 | 설명 |
---|---|---|
1단계 | 커서 선언 (declaration) | 사용자가 직접 이름을 지정하여 사용할 커서를 SQL문과 함께 선언합니다. |
2단계 | 커서 열기 (open) | 커서를 선언할 때 작성한 SQL문을 실행합니다. 이때 실행한 SQL문에 영향을 받는 행을 active set라 합니다. |
3단계 | 커서에서 읽어온 데이터 사용 (fetch) | 실행된 SQL문의 결과 행 정보를 하나씩 읽어 와서 변수에 저장한 후 필요한 작업을 수행합니다. 각 행별로 공통 작업을 반복해서 실행하기 위해 여러 종류의 LOOP문을 함께 사용할 수 있습니다. |
4단계 | 커서 닫기 (close) | 모든 행의 사용이 끝나고 커서를 종료합니다. |
// 기본 형식
DECLARE
CURSOR 커서 이름 IS SQL문; -- 커서 선언(Declaration)
BEGIN
OPEN 커서 이름; -- 커서 열기(Open)
FETCH 커서이름 INTO 변수 -- 커서로부터 읽어온 데이터 사용(Fetch)
CLOSE 커서이름; -- 커서 닫기(Close)
END;
커서에 지정한 SELECT문이 여러 행을 결과 값을 가질 경우에 여러 방식의 LOOP문을 사용할 수 있다.
%NOTFOUND는 실행된 FETCH문에서 행을 추출했으면 false, 추출하지 않았으면 true를 반환한다.
FETCH문을 통해 더 이상 추출한 데이터가 없을 경우에 LOOP 반복이 끝난다.
속성 | 설명 |
---|---|
커서 이름%NOTFOUND | 수행된 FETCH문을 통해 추출된 행이 있으면 false, 없으면 true를 반환합니다. |
커서 이름%FOUND | 수행된 FETCH문을 통해 추출된 행이 있으면 true, 없으면 false를 반환합니다. |
커서 이름%ROWCOUNT | 현재까지 추출된 행 수를 반환합니다. |
커서 이름%ISOPEN | 커서가 열려(open) 있으면 true, 닫혀(close) 있으면 false를 반환합니다. |
// 기본 형식
FOR 루프 인덱스 이름 IN 커서 이름 LOOP
결과 행별로 반복 수행할 작업;
END LOOP;
// 기본 형식
CURSOR 커서 이름(파라미터 이름 자료형, ...) IS
SELECT ...
묵시적 커서
속성 | 설명 |
---|---|
SQL%NOTFOUND | 묵시적 커서 안에 추출한 행이 있으면 false, 없으면 true를 반환합니다. DML 명령어로 영향을 받는 행이 없을 경우에도 true를 반환합니다. |
SQL%FOUND | 묵시적 커서 안에 추출한 행이 있으면 true, 없으면 false를 반환합니다. DML 명령어로 영향을 받는 행이 있다면 true를 반환합니다. |
SQL%ROWCOUNT | 묵시적 커서에 현재까지 추출한 행 수 또는 DML 명령어로 영향받는 행 수를 반환합니다. |
SQL%ISOPEN | 묵시적 커서는 자동으로 SQL문을 실행한 후 CLOSE되므로 이 속성은 항상 false를 반환합니다. |