2012-10-07
DBMS/오라클]오라클_커서_사용법
원본 출처 :: http://netme.kr/bbs/board.php?bo_table=sub_2011&wr_id=23
1. 커서의 정의
커서란 SQL Plus에서 사용자가 실행한 SQL문의 단위를 의미합니다.
오라클렝서 수행한 모든 쿼리문은 커서 단위로 처리합니다.
PL/SQL의 SQL문처럼 하나의 결과를 리턴하는 경우 커서 없이도 SQL문의 실행결과가
암시적으로 커서에 저장되므로 이를 암시적 커서라고 합니다.
SQL문을 수행한 후에 결과로 얻어지는 행이 여러 개일 경우에는 암시적인 커서에 정보를
저장할 수 없기에 에러가 발생합니다. 이럴 경우에는 반드시 명시적인 커서를 사용해야 합니다.
명시적인 커서는 PL/SQL의 레코드(RECORD)와 PL/SQL의 테이블(TABLE)을 결합한 것으로서
프로그램 언어의 구조체 배열과 유사합니다.
[커서의 사용]
1) 커서를 선언한다.
CURSOR cur_name
2) 커서를 오픈한다.
OPEN cur_name
3) 커서에 조회한 결과를 인출해 지정한다.
FECTCH cur_name ...
4) 커서를 닫는다
CLOSE cur_name
2. 20번 부서에 근무하는 사원의 정보를 출력하는 예제
ed cur01
SET SERVEROUTPUT ON
declare
vempno NUMBER(4);
vename VARCHAR2(20);
vsal NUMBER(7, 2);
CURSOR C1
IS
select empno, ename, sal
from emp
where deptno=20;
begin
OPEN C1;
dbms_output.put_line('empno ename sal');
LOOP
FETCH C1 INTO vempno, vename, vsal;
EXIT WHEN C1%NOTFOUND;
dbms_output.put_line(to_char(vempno)||' '||vename||' '||to_char(vsal));
END LOOP;
end;
/
저장하고 실행합니다.
@cur01
empno ename sal
7369 SMITH 800
...
...
...
...
...
PL/SQL procedure successfully completed.
3. OPEN-FETCH-CLOSE가 없이 커서 처리
ed cur02
SET SERVEROUTPUT ON
declare
vemp emp%ROWTYPE;
CURSOR C1
IS
select empno, ename, sal
from emp
where deptno=20;
begin
dbms_output.put_line('empno ename sal');
FOR vemp IN C1 LOOP
EXIT WHEN C1%NOTFOUND;
dbms_output.put_line(to_char(vemp.empno)||' '||vemp.ename||' '||to_char(vemp.sal));
END LOOP;
end;
/
정장하고 실행합니다.
@cur02
empno ename sal
7369 SMITH 800
...
...
...
...
...
PL/SQL procedure successfully completed.
4. 커서의 상태
%NOTFOUND 커서 영역의 자료가 모두 FETCH 됬는가를 알려줌
%FOUND 커서 영역에 FETCH가 되지 않은 자료가 있는가를 알려줌
%ISOPEN 커서가 OPEN된 상태인가를 알려줌
%ROWCOUNT FETCH된 RECORD가 몇 개 있는지 알려줌
cur02 예제를 수정합니다.
ed cur02
SET SERVEROUTPUT ON
declare
vemp emp%ROWTYPE;
CURSOR C1
IS
select empno, ename, sal
from emp
where deptno=20;
begin
dbms_output.put_line('empno ename sal record count');
FOR vemp IN C1 LOOP
EXIT WHEN C1%NOTFOUND;
dbms_output.put_line(to_char(vemp.empno)||' '||vemp.ename||' '||to_char(vemp.sal)||' '||C1%ROWCOUNT);
END LOOP;
end;
/
저장하고 실행합니다.
@cur02
결과는 record count 추가되었습니다.
5. 커서를 활용한 실용 예제
1) 급여 총합을 구하는 예제
ed cur03
SET SERVEROUTPUT ON
declare
tot NUMBER := 0;
CURSOR emp_cursor
IS
select ename, sal
from emp;
begin
dbms_output.put_line('name sal');
dbms_output.put_line('------------------------------------------');
FOR cur_var IN emp_cursor LOOP
tot := tot + cur_var.sal;
dbms_output.put_line(cur_var.ename);
dbms_output.put_line('- '||cur_var.sal);
END LOOP;
dbms_output.put_line('------------------------------------------');
dbms_output.put_line('- '||tot);
end;
/
저장하고 실행합니다
@cur03
2) 사원별 급여 현황을 그래포로 표현
ed cur04
SET SERVEROUTPUT ON
declare
CURSOR emp_cursor
IS
select ename, sal
from emp
order by sal desc;
star varchar2(100);
cnt number := 0;
begin
dbms_output.put_line(' sal of emp');
dbms_output.put_line('------------------------------------------');
FOR cur_var IN emp_cursor LOOP
star := NULL;
cnt := round(cur_var.sal/100, 0);
for i in 1.. cnt loop
star := star||'*';
end loop;
dbms_output.put_line(cur_var.ename);
dbms_output.put_line('- '||star||'('||cur_var.sal||')');
END LOOP;
end;
/
저장하고 실행합니다
@cur04
2012-10-06
DBMS/오라클]명시적_커서(Explicit_Cursor)_사용법
커서 | 묵시적 커서(Implicit Cursor) | 명시적 커서(Explicit Cursor) |
커서(Cursor) 명시적 커서(Explicit Cursor) | |
정의 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
● 명시적 커서는 하나 이상의 행을 액세스하는 SELECT 명령문을 처리하기 위해서사용 ● 선언부에서 명시적으로 커서 선언 ● 명시적 커서는 블록의 실행부에서 커서 조작 명령을 통해 처리 ● 명령을 이용하여 질의에 의해 반환된 행들을 한번에 한 행씩 처리 ● 커서 선언은 선언부에서, 커서 OPEN, FETCH, CLOSE 정의는 실행부에서 정의 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
처리 과정 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
① 커서 선언(DECLARE CURSOR절) : 커서는 공유풀 내의 전용 SQL 영역에 생성 ② 커서 열기(OPEN절) : 커서를 활성화하여 커서와 연관된 SELECT 명령문 실행 ③ 데이타 추출(FETCH절) : SELECT명령문에 의해 검색된 행 중에서 커서가 가리키는 행을 액세스 ④ 커서 닫기(CLOSE절) : 오픈된 커서를 비활성화 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
커서 선언 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
● 커서를 선언하고, 커서와 관련된 SELECT 명령문 정의 ● SELECT 문장에는 INTO절을 사용하지 않음 ● INTO절은 실행부의 FETCH 명령문에서 사용 ● 커서 선언 부분에서 지역 변수나 전역 변수 사용 가능 ● 커서 정의에서 사용되는 지역 변수나 전역 변수는 반드시 커서 선언 전에 정의 필요 ● 변수는 컬럼명과 다르게 선언
☞ 사용법
☞ 사용예
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
커서 열기 (OPEN) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
● 공유풀의 라이브러리 캐쉬에 설정된 커서 영역을 오픈 ● 선언된 커서와 연관된 SELECT 명령문을 실행하여 active set을 구성 ● 커서는 검색된 행으로 구성된 active set 중에서 첫 번째 행을 가르킴 ● 실행과정 - 구문분석(Parsing) : 문장이나 의미, 권한 등이 제대로 되어 있는지 검사 - 바인딩(Binding) : 변수의 값을 할당 - 실행(Excute) : 라이브러리 캐쉬에 할당된 커서 영역을 오픈하고 active set구성
☞ 사용법
☞ 사용예
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
데이타 추출 (FETCH) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
● 현재 커서가 가르키는 행의 값을 변수로 할당하는 과정 ● 커서 선언시 사용한 SELECT 명령문의 컬럼 개수와 데이타타입이 FECTH ∼ INTO절의 변수 개수, 데이타타입과 동일해야 함
☞ 사용법
- 현재 검색된 결과 행을 저장하기 위한 변수 리스트 - variable_list 변수의 개수는 커서 선언부에서 정의한 SELECT문장의 컬럼 개수와 동일 - 커서 안에서 PL/SQL 레코드 타입 설정이 가능하며, variable_list에도 사용 가능
☞ 사용예
☞ 사용예
선언하는 것과 동일한 효과를 얻을 수 있음 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
커서 | 묵시적 커서(Implicit Cursor) | 명시적 커서(Explicit Cursor) |
2012-09-16
DBMS/오라클]명시적 커서(Explicit Cursor) 사용법
명시적 커서와 묵시적 커서에 대한 설명 문서 : 03_SQL_CURSOR.pdf
명시적 커서(Explicit Cursor)
|
커서(Cursor) 명시적 커서(Explicit Cursor) | |
정의 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
● 명시적 커서는 하나 이상의 행을 액세스하는 SELECT 명령문을 처리하기 위해서사용 ● 선언부에서 명시적으로 커서 선언 ● 명시적 커서는 블록의 실행부에서 커서 조작 명령을 통해 처리 ● 명령을 이용하여 질의에 의해 반환된 행들을 한번에 한 행씩 처리 ● 커서 선언은 선언부에서, 커서 OPEN, FETCH, CLOSE 정의는 실행부에서 정의 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
처리 과정 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
① 커서 선언(DECLARE CURSOR절) : 커서는 공유풀 내의 전용 SQL 영역에 생성
② 커서 열기(OPEN절) : 커서를 활성화하여 커서와 연관된 SELECT 명령문 실행 ③ 데이타 추출(FETCH절) : SELECT명령문에 의해 검색된 행 중에서 커서가 가리키는 행을 액세스 ④ 커서 닫기(CLOSE절) : 오픈된 커서를 비활성화 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
커서 선언 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
● 커서를 선언하고, 커서와 관련된 SELECT 명령문 정의 ● SELECT 문장에는 INTO절을 사용하지 않음 ● INTO절은 실행부의 FETCH 명령문에서 사용 ● 커서 선언 부분에서 지역 변수나 전역 변수 사용 가능 ● 커서 정의에서 사용되는 지역 변수나 전역 변수는 반드시 커서 선언 전에 정의 필요 ● 변수는 컬럼명과 다르게 선언
☞ 사용법
☞ 사용예
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
커서 열기 (OPEN) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
● 공유풀의 라이브러리 캐쉬에 설정된 커서 영역을 오픈 ● 선언된 커서와 연관된 SELECT 명령문을 실행하여 active set을 구성 ● 커서는 검색된 행으로 구성된 active set 중에서 첫 번째 행을 가르킴 ● 실행과정 - 구문분석(Parsing) : 문장이나 의미, 권한 등이 제대로 되어 있는지 검사 - 바인딩(Binding) : 변수의 값을 할당 - 실행(Excute) : 라이브러리 캐쉬에 할당된 커서 영역을 오픈하고 active set구성
☞ 사용법
☞ 사용예
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
데이타 추출 (FETCH) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
● 현재 커서가 가르키는 행의 값을 변수로 할당하는 과정 ● 커서 선언시 사용한 SELECT 명령문의 컬럼 개수와 데이타타입이 FECTH ∼ INTO절의 변수 개수, 데이타타입과 동일해야 함
☞ 사용법
● variable_list
- 현재 검색된 결과 행을 저장하기 위한 변수 리스트 - variable_list 변수의 개수는 커서 선언부에서 정의한 SELECT문장의 컬럼 개수와 동일 - 커서 안에서 PL/SQL 레코드 타입 설정이 가능하며, variable_list에도 사용 가능
☞ 사용예
☞ 사용예
- 매개변수가 있는 커서를 선언하면 매개변수의 값이 바뀔때 마다 질의 조건이 바뀌므로 여러 개의 커서를
선언하는 것과 동일한 효과를 얻을 수 있음 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
명시적 커서(Explicit Cursor)
|
피드 구독하기:
글 (Atom)