커서란 무엇인가?
- - 커서는 Private SQL의 작업 영역이다.
- - 오라클 서버에 의해 실행되는 모든 SQL문은 연관된 각각의 커서를 소유하고 있다.
- - 커서의 종류
- 암시적 커서 : 모든 DML과 PL/SQL SELECT문에 대해 선언된다.
- 명시적 커서 : 프로그래머에 의해 선언되며 이름이 있는 커서이다.
Explicit Cursor의 흐름도?
문법(Syntax)
커서 열기(OPEN)
- - 커서의 열기는 OPEN문을 사용한다.
- - 커서안의 검색이 실행되며 아무런 데이터행을 추출하지 못해도 에러가 발생하지 않는다.
- - 문법 : OPEN cursor_name;
커서 패치(FETCH)
- - 커서의 FETCH는 현재 데이터 행을 OUTPUT변수에 반환 한다.
- - 커서의 SELECT문의 컬럼의 수와 OUTPUT변수의 수가 동일해야 한다.
- - 커서 컬럼의 변수의 타입과 OUTPUT변수의 데이터 타입도 동일해야 한다.
- - 커서는 한 라인씩 데이터를 패치 한다.
- - 문법 : FETCH cursor_name INTO variable1, variable2;
커서 닫기(CLOSE)
- - 사용을 맞친 커서는 반드시 닫아 주어야 한다.
- - 필요하다면 커서를 다시 열 수 있다.
- - 커서를 닫은 상태에서 FETCH를 할 수 없다.
- - 문법 : CLOSE cursor_name;
Explicit Cursor 예제
-- 특정 부서의 평균급여와 사원수를 출력.. SQL> CREATE OR REPLACE PROCEDURE ExpCursor_Test (v_deptno IN dept.deptno%TYPE) IS CURSOR dept_avg IS SELECT b.dname, COUNT(a.empno) cnt, ROUND(AVG(a.sal),3) salary FROM emp a, dept b WHERE a.deptno = b.deptno AND b.deptno = v_deptno GROUP BY b.dname ; -- 커서를 패치하기 위한 편수 선언 v_dname dept.dname%TYPE; emp_cnt NUMBER; sal_avg NUMBER; BEGIN -- 커서의 오픈 OPEN dept_avg; -- 커서의 패치 FETCH dept_avg INTO v_dname, emp_cnt, sal_avg; DBMS_OUTPUT.PUT_LINE('부서명 : ' || v_dname); DBMS_OUTPUT.PUT_LINE('사원수 : ' || emp_cnt); DBMS_OUTPUT.PUT_LINE('평균급여 : ' || sal_avg); -- 커서의 CLOSE CLOSE dept_avg; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLERRM||'에러 발생 '); END; / -- DBMS_OUTPUT.PUT_LINE을 출력하기 위해 사용 SQL> SET SERVEROUTPUT ON ; SQL> EXECUTE ExpCursor_Test(30); 부서명 : SALES 사원수 : 6 평균급여 : 1550.833
태그
문서에 대하여
- - 강좌 URL : http://www.gurubee.net/lecture/1064
- - 이 문서를 다른 블로그나 홈페이지에 게재하실 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- - 구루비의 모든 강좌는 크리에이티브 커먼즈의 저작자표시-비영리-동일조건변경허락(BY-NC-SA) 라이선스에 따라 자유롭게 사용할 수 있습니다.
'IT > 오라클' 카테고리의 다른 글
Oracle PL/SQL 강좌 6.2.3. 명시적 커서의 속성(Explicit Cursor Attributes) (0) | 2015.11.24 |
---|---|
Oracle PL/SQL 강좌 6.2.2. FOR문에서 커서 사용(Cursor FOR Loops) (0) | 2015.11.24 |
Oracle PL/SQL 강좌 6.1. 암시적 커서(Implicit Cursor) (0) | 2015.11.24 |
Oracle PL/SQL 강좌 5.2. 조건제어(IF) (0) | 2015.11.24 |
Oracle PL/SQL 강좌 5.1.2. LOOP문, WHILE문 (0) | 2015.11.24 |