본문 바로가기
개발 수업/DB

[PL/SQL] 패키지, 커서

by 오늘 하루s 2023. 6. 16.
728x90
더보기

Day34. 230616

패키지

- 오라클 데이터베이스에 저장되어 있는 서로 관련있는 PL/SQL 프로지져와 함수들의 집합

 

커서

커서란?

특정 SQL 문장을 철한 결과를 담고있는 영역

- 암시적 커서 : 모든 DML과 PL/SQL SELECT문에 대해 선언된다.
- 명시적 커서 : 프로그래머에 의해 선언되며 이름이 있는 커서이다.

CURSOR 커서명 IS
select문;

 

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
CREATE    OR REPLACE    procedure   dept_proc( 
        p_deptno  IN   dept.deptno%TYPE
   ) 
IS
    --커서선언
    CURSOR   cur_dept_avg  IS 
    select  d.dname, d.deptno, count(e.empno), round( avg(e.sal),0)
    
    from    emp e, dept d
    where  e.deptno=d.deptno
                AND
                d.deptno=p_deptno
    group by d.dname, d.deptno;
    --변수선언
    v_dname    dept.dname%TYPE;
    v_deptno    dept.deptno%TYPE;
    v_cnt           NUMBER:=0;
    v_avg_sal    NUMBER:=0;
 
 BEGIN
    --커서open
    OPEN cur_dept_avg;
    
    --커서 FETCH
    FETCH cur_dept_avg INTO v_dname, v_deptno, v_cnt,v_avg_sal;
    
    IF cur_dept_avg%FOUND THEN
        DBMS_OUTPUT.PUT_LINE('--결과를 출력합니다--');
        DBMS_OUTPUT.PUT_LINE('v_dname: ' || v_dname);
        DBMS_OUTPUT.PUT_LINE('v_deptno: ' || v_deptno);
        DBMS_OUTPUT.PUT_LINE('v_cnt: ' || v_cnt);
        DBMS_OUTPUT.PUT_LINE('v_avg_sal: ' || v_avg_sal);
    END IF;
    IF cur_dept_avg%NOTFOUND THEN
        DBMS_OUTPUT.PUT_LINE('데이터가 없습니다');
    END IF;
    
    --커서close
    CLOSE cur_dept_avg;
    
    EXCEPTION 
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('예외가 발생했어요: ' || SQLERRM);
 
END;
 
DECLARE
  CODE_NUM CONSTANT NUMBER := 100;
 
cs

실행) exec dept_proc(100);

->결과. 데이터가 없습니다.

 

exec dept_proc(10);

728x90

'개발 수업 > DB' 카테고리의 다른 글

MySQL설치, 환경설정  (0) 2023.06.27
[Oracle] DB EXPORT  (0) 2023.06.27
[PL/SQL] PL/SQL구성요소(상수),PL/SQL 제어문  (0) 2023.06.16
DB, JAVA 연동  (0) 2023.06.15
[PL/SQL] 예외(Exception),pragma  (0) 2023.06.15