A> CURSOR
SQL에서 커서란
SQL문을 실행, 처리를 위한 메모리공간에서
특정한 레코드에 위치한 포인터와 비슷한 개념
커서의 위치를 변경해서 특정 실행 결과를 가지고 온다.
커서의 서브쿼리는 select문만 올 수가 있다.
B> 종류
묵시적/ 명시적
1.묵시적 커서
오라클 서버가 만듦
SQL% 이 있으면 묵시적 커서
하나만 선언 가능
1-1.문형
SQL%속성
1-2. 종류
1)SQL%ROWCOUNT
해당 커서에서 실행한 총 행의 개수
2)SQL%FOUND
커서 안에 데이터가 있느냐 없느냐 TURE, FALSE 리턴
3)SQL%ISOPEN
메모리에 OPEN되어 있으면 true 아니면 false
4)예시
DECLARE
v_deptno number := &dno;
BEGIN
delete emp where deptno = v_deptno;
DBMS_OUTPUT.PUT_LINE('삭제된 데이터 건수는 '|| SQL%ROWCOUNT);
END;
2.명시적 커서
개발자가 만듦
주로 여러개의 행을 처리할 경우 사용
묵시적 커서와는 다르게 동시에 여러개 선언가능
서브쿼리를 쓰고 그 결과를 가져온다는 점이 VIEW와 비슷함
2-1.문형
커서명%속성
2-2.종류
1)커서명%ROWCOUNT
검색한 데이터 총 행 수
2)커서명%FOUND
커서 안에 데이터가 있느냐 없느냐 TURE, FALSE 리턴
3)커서명%ISOPEN
메모리에 OPEN되어 있으면 true 아니면 false
3.명시적 커서 사용
1)선언
CURSOR 커서명 IS 커서에 담고 싶은 내용을 가져오는 서브쿼리
주의 --커서명은 유일하게
2)커서 열기
OPEN 커서 이름;
3)데이터를 읽어서 변수에 저장하기 =FETCH 작업
FETCH 커서이름 INTO 변수들
4)닫기
CLOSE 커서
5예시
DECLARE
vempno number(4);
vename varchar2(20);
vsal number(7);
--커서 선언
cursor c1 IS
SELECT empno,ename,sal
FROM emp
WHERE deptno=20;
BEGIN
--커서 오픈
open c1;
--루프를 돌면서 변수에 저장
LOOP
--커서로 읽은 정보 변수에 저장
fetch c1 into vempno,vename, vsal;
--커서로 읽은게 없으면 끝
exit WHEN c1%NOTFOUND;
END loop;
dbms_OUTPUT.PUT_LINE(vempno||' '|| vename||' '|| vsal);
--커서 닫기
close c1;
END;
예시1.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
DECLARE
CURSOR cur_emp IS
SELECT ename,sal FROM emp
WHERE deptno = &dno;
v_ename emp.ename%TYPE;
v_sal emp.sal%TYPE;
BEGIN
OPEN cur_emp;
LOOP
FETCH cur_emp INTO v_ename, v_sal;
EXIT WHEN cur_emp%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_ename||' '|| v_sal);
END LOOP;
CLOSE cur_emp;
END;
|
cs |
B>CURSOR FOR LOOP
커서용 FOR 문: 명시적 커서의 행수 만큼 수행 됨
문형
FOR 레코드 이름 IN 커서이름 LOOP --커서의 데이터를 저장할 변수'레코드 이름이'이 선언된다.
실행문
END LOOP; --END LOOP 시 커서 자동 close
예시1.
DECLARE
CURSOR emp_cur IS
SELECT empno,ename
FROM emp;
BEGIN
FOR emp_rec IN emp_cur LOOP
dbms_OUTPUT.PUT_LINE(emp_rec.empno||' '|| emp_rec.ename);
END LOOP;
END;
예시2.
DECLARE vemp emp%ROWTYPE; CURSOR c1 IS SELECT empno,ename,sal FROM emp; BEGIN FOR vemp IN c1 LOOP EXIT WHEN c1%NOTFOUND; dbms_OUTPUT.PUT_LINE(vemp.empno||' '|| vemp.ename||' '||vemp.sal); END LOOP; END;
C>Explicit Cursor
마치 매개변수를 받는 것처럼 커서를 구성
예시
DECLARE
CURSOR emp_cur (p_dno emp.deptno%type) IS
SELECT EMPNO, ENAME, SAL
FROM EMP
WHERE DEPTNO = p_dno;
BEGIN
OPEN emp_cur(20) ;
CLOSE emp_cur ;
OPEN emp_cur(30) ;
CLOSE emp_cur ;
END;
'DB관련 > oracle' 카테고리의 다른 글
서브 프로그램 - 프로시져(PROCEDURE) (0) | 2021.01.21 |
---|---|
예외와 예외처리 (0) | 2021.01.21 |
PL/SQL 3- 복합 변수, 제어문 (0) | 2021.01.20 |
PL/SQL -2 스칼라 변수 (0) | 2021.01.20 |
PL/SQL -1 (0) | 2021.01.20 |