29
The Technique of Java Programming

오라클 SQL과 PL/SQL을 다루는 기술 - 11장.커서,레코드,컬렉션

Embed Size (px)

Citation preview

Page 1: 오라클 SQL과 PL/SQL을 다루는 기술 - 11장.커서,레코드,컬렉션

The Technique of Java Programming

Page 2: 오라클 SQL과 PL/SQL을 다루는 기술 - 11장.커서,레코드,컬렉션

들어가기

이 자료는 교육 등 비영리 목적으로만 사용해야 합니다 !!!!

Page 3: 오라클 SQL과 PL/SQL을 다루는 기술 - 11장.커서,레코드,컬렉션

만든사람 및 책 소개

• 오라클 SQL과 PL/SQL을 다루는 기술 : 오라클 프로그래밍 , 현장 밀착 입문서는 따로 있다 !

• 홍형경

• 주요 저서 : - 〈뇌를 자극하는 오라클 프로그래밍 SQL&PL/SQL

- Head First 시리즈를 비롯해 다수의 책 번역

Page 4: 오라클 SQL과 PL/SQL을 다루는 기술 - 11장.커서,레코드,컬렉션

커서 , 레코드 , 컬렉션을 살펴보자둘째 마당 . 복잡한 비즈니스 로직을 처리하는 PL/SQL

11장

Page 5: 오라클 SQL과 PL/SQL을 다루는 기술 - 11장.커서,레코드,컬렉션

01 커서

레코드

컬렉션

02

커서 , 레코드 , 컬렉션을 살펴보자

03

Page 6: 오라클 SQL과 PL/SQL을 다루는 기술 - 11장.커서,레코드,컬렉션

01

커서

커서

● 특정 SQL 문장을 처리한 결과를 담고 있는 영역을 가리키는 일종의 포인터

● 묵시적 커서 (Implicit cursor) : 오라클 내부에서 자동으로 생성되어 사용하는 커서

● 명시적 커서 (Explicit cursor) : 사용자가 직접 정의해서 사용하는 커서

● 커서 속성

ㆍ SQL%FOUND : 패치 로우 수가 1 개 이상이면 TRUE, 아니면 FALSE 반환

ㆍ SQL%NOTFOUND : 패치 로우 수가 0 이면 TRUE, 아니면 FALSE 를 반환

ㆍ SQL%ROWCOUNT : 영향 받은 결과 집합의 로우 수 반환 , 없으면 0 을 반환

ㆍ SQL%ISOPEN : 커서가 열려 있으면 TRUE, 아니면 FALSE

Page 7: 오라클 SQL과 PL/SQL을 다루는 기술 - 11장.커서,레코드,컬렉션

01

명시적 커서 사용

커서

● 커서 선언

CURSOR 커서명 [ ( 매개변수 1, 매개변수 2, …)] IS SELECT 문장 ;

● 커서 열기

OPEN 커서명 [( 매개변수 1, 매개변수 2, …)];

Page 8: 오라클 SQL과 PL/SQL을 다루는 기술 - 11장.커서,레코드,컬렉션

01

명시적 커서 사용

커서

● 커서 사용

LOOP FETCH 커서명 INTO 변수 1, 변수 2, …;

EXIT WHEN 커서명 %NOTFOUND; END LOOP;

● 커서 닫기

CLOSE 커서명 ;

Page 9: 오라클 SQL과 PL/SQL을 다루는 기술 - 11장.커서,레코드,컬렉션

01

커서와 FOR 문

커서

● 커서와 FOR 문 사용

FOR 레코드 IN 커서명 ( 매개변수 1, 매개변수 2, …) LOOP 처리문 ; END LOOP;

● 또 다른 형태

FOR emp_rec IN ( SELECT emp_name -- 커서정의 부분을 FOR 문에서 직접 사용 FROM employees WHERE department_id = 90

) LOOP DBMS_OUTPUT.PUT_LINE(emp_rec.emp_name); END LOOP;

Page 10: 오라클 SQL과 PL/SQL을 다루는 기술 - 11장.커서,레코드,컬렉션

01

커서 변수

커서

● 커서를 변수에 할당해서 사용

● 커서 변수의 특징

ㆍ 한 개 이상의 쿼리를 연결해 사용할 수 있다

ㆍ 변수처럼 커서 변수를 함수나 프로시저의 매개변수로 전달할 수 있다

ㆍ 커서 속성을 사용할 수 있다

Page 11: 오라클 SQL과 PL/SQL을 다루는 기술 - 11장.커서,레코드,컬렉션

01

커서 변수의 사용

커서

● 커서 변수 선언

ㆍ TYPE 커서 _ 타입명 IS REF CURSOR [ RETURN 반환 타입 ] ;

ㆍ 커서 _ 변수명 커서 _ 타입명 ;

ㆍ RETURN 반환타입을 명시하는 경우 이를 강한 (strong) 커서타입 이라고 함

ㆍ RETURN 반환타입을 생략 시 이를 약한 (week) 커서타입 이라고 함

ㆍ SYS_REFCURSOR : 빌트 인 커서 타입

Page 12: 오라클 SQL과 PL/SQL을 다루는 기술 - 11장.커서,레코드,컬렉션

01

커서 변수의 사용

커서

● 커서 변수와 커서 정의 쿼리문 연결

OPEN 커서변수명 FOR select 문 ;

● 커서 변수에서 결과집합 가져오기

• FETCH 커서변수명 INTO 변수 1, 변수 2, …;

혹은

• FETCH 커서변수명 INTO 레코드명 ;

Page 13: 오라클 SQL과 PL/SQL을 다루는 기술 - 11장.커서,레코드,컬렉션

01

커서 변수 사용 예

커서

DECLARE

TYPE emp_dep_curtype IS REF CURSOR; -- 약한 커서 타입 선언 emp_dep_curvar emp_dep_curtype; -- 커서 변수 선언

BEGIN -- 커서 변수를 사용한 커서 정의 및 오픈 OPEN emp_dep_curvar FOR SELECT emp_name FROM employees WHERE department_id = 90;  -- LOOP 문 LOOP -- 커서 변수를 사용해 결과 집합을 vs_emp_name 변수에 할당 FETCH emp_dep_curvar INTO vs_emp_name; EXIT WHEN emp_dep_curvar%NOTFOUND; DBMS_OUTPUT.PUT_LINE(vs_emp_name); -- 사원명을 출력 END LOOP;

Page 14: 오라클 SQL과 PL/SQL을 다루는 기술 - 11장.커서,레코드,컬렉션

01

커서 표현식

커서

● SELECT 문에서 컬럼 형태로 커서를 사용

● 구문

CURSOR ( 서브쿼리 )

● 사용 예

SELECT d.department_name, CURSOR ( SELECT e.emp_name FROM employees e WHERE e.department_id = d.department_id ) AS emp_name FROM departments d WHERE d.department_id = 90;

Page 15: 오라클 SQL과 PL/SQL을 다루는 기술 - 11장.커서,레코드,컬렉션

02

레코드란 ?

레코드

● PL/SQL 에서 제공하는 여러 원시형 데이터타입이 섞인 하나의 타입

● 테이블과 비슷 . 로우 수가 1 개인 테이블 형태임

● 서로 다른 유형의 데이터타입이 죽 연결된 형태

● 커서형 , 사용자 정의형 , 테이블 형 레코드로 구분 가능

● 커서형 레코드 커서 변수 형태

Page 16: 오라클 SQL과 PL/SQL을 다루는 기술 - 11장.커서,레코드,컬렉션

02

사용자 정의형 레코드

레코드

● 사용자가 직접 레코드를 정의 , 선언해서 사용

● 구문

TYPE 레코드명 IS RECORD ( 필드명 1 필드 1 타입 [[NOT NULL] := 디폴트값 ], 필드명 2 필드 2 타입 [[NOT NULL] := 디폴트값 ], … );

레코드변수명 레코드명 ;

● 레코드 필드 사용 : 레코드변수명 . 필드명 형태로 접근 가능

Page 17: 오라클 SQL과 PL/SQL을 다루는 기술 - 11장.커서,레코드,컬렉션

02

테이블형 레코드

레코드

● 특정 테이블의 컬럼 전체를 레코드로 선언해 사용 가능

● 구문

레코드변수명 테이블명 %ROWTYPE;

● 사용 예

vr_dep departments%ROWTYPE; -- 테이블형 레코드 변수 선언

-- 부서 테이블의 모든 정보를 레코드 변수에 넣는다 . SELECT * INTO vr_dep FROM departments WHERE department_id = 20;

Page 18: 오라클 SQL과 PL/SQL을 다루는 기술 - 11장.커서,레코드,컬렉션

02

커서형 레코드

레코드

● 커서를 레코드 변수로 받아 사용 : 커서명 %ROWTYPE

● 사용 예

-- 커서 선언 CURSOR c1 IS SELECT department_id, department_name, parent_id, manager_id FROM departments; -- 커서형 레코드 변수 선언 vr_dep c1%ROWTYPE;

Page 19: 오라클 SQL과 PL/SQL을 다루는 기술 - 11장.커서,레코드,컬렉션

02

중첩 레코드

레코드

● 레코드의 한 필드의 타입이 또 다른 레코드 형인 경우

● 중첩 레코드의 필드 접근 방식

ㆍ 일반 필드 : 레코드 1. 필드명

ㆍ 중첩 필드 : 레코드 1. 레코드 2. 필드명

Page 20: 오라클 SQL과 PL/SQL을 다루는 기술 - 11장.커서,레코드,컬렉션

03

컬렉션이란 ?

컬렉션

● 레코드와 유사하지만 같은 데이터 타입의 요소로 구성되며 여러 로우를 가진 타입

● 객체지향 프로그램의 클래스와 유사 생성자와 컬렉션 메소드 사용

● 3 가지 타입의 컬렉션 존재

● 연관배열 (Associative Array)

● VARRAY

● 중첩 테이블 (Nested Table)

Page 21: 오라클 SQL과 PL/SQL을 다루는 기술 - 11장.커서,레코드,컬렉션

03

연관배열 (Associative Array)

컬렉션

● 키 - 값으로 구성 ( 키를 인덱스라고도 부르기 때문에 Index-by 테이블 이라고도 함 )

● 전화번호부와 비슷

● 생성구문

TYPE 연관 _ 배열명 IS TABLE OF 연관 _ 배열 _ 값타입 INDEX BY 인덱스타입 ;

● 인덱스타입으로는 문자형과 PLS_INTEGER 타입이 올 수 있음

● 연관 _ 배열 _ 변수명 ( 인덱스 ) 형태로 접근

● 크기 제한이 없음

Page 22: 오라클 SQL과 PL/SQL을 다루는 기술 - 11장.커서,레코드,컬렉션

03

VARRY (Variable-Size Array)

컬렉션

● 선언 시 크기 지정하므로 크기 제한 지정한 크기보다 많은 요소 입력 시 오류 발생

● 인덱스타입은 숫자형만 가능하며 자동 채번됨 최소값은 1

● 생성구문

TYPE VARRAY 명 IS VARRAY( 최대크기 ) OF 요소값 _ 타입 ;

● 생성자를 사용해 초기화 초기화 전에는 접근 불가

● 변수명 ( 인덱스 ) 형태로 접근

● 일반 테이블의 컬럼 타입으로 사용 가능

CREATE OR REPLACE TYPE 구문으로 VARRAY 형의 TYPE 객체 생성 후 사용

Page 23: 오라클 SQL과 PL/SQL을 다루는 기술 - 11장.커서,레코드,컬렉션

03

중첩 테이블 (Nested Table)

컬렉션

● 크기 제한이 없고 숫자형 인덱스만 사용 가능하며 생성자를 사용해 초기화

● 연관 배열보다는 VARRAY 와 유사

● 생성구문

TYPE 중첩 _ 테이블명 IS TABLE OF 값타입 ;

● 일반 테이블의 컬럼 타입으로 사용 가능

CREATE OR REPLACE TYPE 구문으로 중첩테이블 형의 TYPE 객체 생성 후 사용

Page 24: 오라클 SQL과 PL/SQL을 다루는 기술 - 11장.커서,레코드,컬렉션

● 컬렉션 요소에 접근해 값을 가져오거나 수정 , 삭제하는 일련의 빌트인 메소드

03

컬렉션 메소드

컬렉션

메소드명 메소드 타입 설명

DELETE 프로시저 컬렉션 요소를 삭제한다 .

TRIM 프로시저 VARRAY 나 중첩 테이블의 끝에서 요소를 삭제한다 .

EXTEND 프로시저 VARRAY 나 중첩 테이블의 끝에 요소를 추가한다 .

EXISTS 함수 VARRAY 나 중첩 테이블에 특정 요소가 존재하면 TRUE 를 반환한다 .

FIRST 함수 컬렉션이 첫 번째 인덱스를 반환한다 .

LAST 함수 컬렉션의 마지막 인덱스를 반환한다 .

COUNT 함수 컬렉션의 요소의 총 수를 반환한다 .

LIMIT 함수 컬렉션이 가질 수 있는 요소의 최대수를 반환한다 .

PRIOR 함수 특정 인덱스 이전의 인덱스를 반환한다 .

NEXT 함수 특정 인덱스 다음의 인덱스를 반환한다 .

Page 25: 오라클 SQL과 PL/SQL을 다루는 기술 - 11장.커서,레코드,컬렉션

03

사용자 정의 데이터 타입

컬렉션

● VARCHAR2, NUMBER 같은 빌트인 타입이 아닌 사용자가 직접 정의해 사용하는 데이터 타입

● 사용자 정의 타입으로 VARRY 와 중첩 테이블 , OBJECT 타입 생성 가능

● CREATE OR REPLACE TYPE 구문으로 생성

ㆍ VARRAY : CREATE OR REPLACE TYPE 타입명 IS VARRAY( 최대크기 ) OF 값타입 ; ㆍ 중첩 테이블 : CREATE OR REPLACE TYPE 타입명 IS TABLE OF 값타입 ; ㆍ OBJECT : CREATE OR REPLACE TYPE 타입명 IS OBJECT ( 멤버 1 멤버 1_ 데이터 타입 , 멤버 2 멤버 2_ 데이터 타입 , … );

Page 26: 오라클 SQL과 PL/SQL을 다루는 기술 - 11장.커서,레코드,컬렉션

03

다차원 컬렉션

컬렉션

● 컬렉션의 요소 타입이 VARCHAR2, NUMBER 같은 빌트인 타입이 아닌 또 다른 컬렉션인 경우

컬렉션 안에 또 다른 컬렉션이 있는 형태라서 다차원 컬렉션이라고 함

● 사용 예

-- 첫 번째 VARRAY 타입선언 TYPE va_type1 IS VARRAY(5) OF NUMBER; -- va_type1 을 요소 타입으로 하는 VARRAY 타입 선언 TYPE va_type11 IS VARRAY(3) OF va_type1;

Page 27: 오라클 SQL과 PL/SQL을 다루는 기술 - 11장.커서,레코드,컬렉션

03

VARRAY 컬럼 타입

컬렉션

● 일반 테이블의 컬럼 타입으로 VARRAY 타입 사용 가능

● 사용 예

-- 국가 이름을 가지고 있는 VARRAY 타입 생성 . CREATE OR REPLACE TYPE country_var IS VARRAY(7) OF VARCHAR2(30);  -- 대륙별 국가 리스트를 담을 테이블 생성 CREATE TABLE ch11_continent ( continent VARCHAR2(50), -- 대륙명 country_nm country_var -- 국가명을 넣을 VARRAY 타입컬럼 );

Page 28: 오라클 SQL과 PL/SQL을 다루는 기술 - 11장.커서,레코드,컬렉션

03

중첩테이블 컬럼 타입

컬렉션

● 일반 테이블의 컬럼 타입으로 중첩테이블 타입 사용 가능

● 사용 예

-- 중첩 테이블 타입 선언 . CREATE OR REPLACE TYPE country_nt IS TABLE OF VARCHAR2(30);  -- country_nt 라는 중첩테이블 타입의 컬럼을 가진 테이블 생성 CREATE TABLE ch11_continent_nt ( continent VARCHAR2(50), -- 대륙명 country_nm country_nt -- 국가명을 넣을 중첩 테이블 타입 ) NESTED TABLE country_nm STORE AS country_nm_nt -– 중첩테이블의 경우 별도의 저장공간 명시 ;

Page 29: 오라클 SQL과 PL/SQL을 다루는 기술 - 11장.커서,레코드,컬렉션

03

컬렉션 타입별 비교

컬렉션

구분 연관 배열 VARRAY 중첩 테이블

생성구문 TYPE 명칭 IS TABLE OF 값타입 INDEX BY 인덱스타입

TYPE 명칭 IS VARRAY( 최대크기 ) OF

값타입 ;

TYPE 명칭 IS TABLE OF 값타입 ;

크기제한 없음 있음 없음

생성자 없음 있음 있음

인덱스타입 숫자 , 문자 숫자 숫자

사용자 정의타입 불가 선언가능 선언가능

테이블컬럼 불가 사용가능 사용가능

TABLE 함수 불가 사용가능 사용가능

DML 부분처리 불가 불가 가능