Upload
chariehong
View
116
Download
21
Embed Size (px)
Citation preview
The Technique of Java Programming
들어가기
이 자료는 교육 등 비영리 목적으로만 사용해야 합니다 !!!!
만든사람 및 책 소개
• 오라클 SQL과 PL/SQL을 다루는 기술 : 오라클 프로그래밍 , 현장 밀착 입문서는 따로 있다 !
• 홍형경
• 주요 저서 : - 〈뇌를 자극하는 오라클 프로그래밍 SQL&PL/SQL
- Head First 시리즈를 비롯해 다수의 책 번역
커서 , 레코드 , 컬렉션을 살펴보자둘째 마당 . 복잡한 비즈니스 로직을 처리하는 PL/SQL
11장
01 커서
레코드
컬렉션
02
커서 , 레코드 , 컬렉션을 살펴보자
03
01
커서
커서
● 특정 SQL 문장을 처리한 결과를 담고 있는 영역을 가리키는 일종의 포인터
● 묵시적 커서 (Implicit cursor) : 오라클 내부에서 자동으로 생성되어 사용하는 커서
● 명시적 커서 (Explicit cursor) : 사용자가 직접 정의해서 사용하는 커서
● 커서 속성
ㆍ SQL%FOUND : 패치 로우 수가 1 개 이상이면 TRUE, 아니면 FALSE 반환
ㆍ SQL%NOTFOUND : 패치 로우 수가 0 이면 TRUE, 아니면 FALSE 를 반환
ㆍ SQL%ROWCOUNT : 영향 받은 결과 집합의 로우 수 반환 , 없으면 0 을 반환
ㆍ SQL%ISOPEN : 커서가 열려 있으면 TRUE, 아니면 FALSE
01
명시적 커서 사용
커서
● 커서 선언
CURSOR 커서명 [ ( 매개변수 1, 매개변수 2, …)] IS SELECT 문장 ;
● 커서 열기
OPEN 커서명 [( 매개변수 1, 매개변수 2, …)];
01
명시적 커서 사용
커서
● 커서 사용
LOOP FETCH 커서명 INTO 변수 1, 변수 2, …;
EXIT WHEN 커서명 %NOTFOUND; END LOOP;
● 커서 닫기
CLOSE 커서명 ;
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;
01
커서 변수
커서
● 커서를 변수에 할당해서 사용
● 커서 변수의 특징
ㆍ 한 개 이상의 쿼리를 연결해 사용할 수 있다
ㆍ 변수처럼 커서 변수를 함수나 프로시저의 매개변수로 전달할 수 있다
ㆍ 커서 속성을 사용할 수 있다
01
커서 변수의 사용
커서
● 커서 변수 선언
ㆍ TYPE 커서 _ 타입명 IS REF CURSOR [ RETURN 반환 타입 ] ;
ㆍ 커서 _ 변수명 커서 _ 타입명 ;
ㆍ RETURN 반환타입을 명시하는 경우 이를 강한 (strong) 커서타입 이라고 함
ㆍ RETURN 반환타입을 생략 시 이를 약한 (week) 커서타입 이라고 함
ㆍ SYS_REFCURSOR : 빌트 인 커서 타입
01
커서 변수의 사용
커서
● 커서 변수와 커서 정의 쿼리문 연결
OPEN 커서변수명 FOR select 문 ;
● 커서 변수에서 결과집합 가져오기
• FETCH 커서변수명 INTO 변수 1, 변수 2, …;
혹은
• FETCH 커서변수명 INTO 레코드명 ;
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;
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;
02
레코드란 ?
레코드
● PL/SQL 에서 제공하는 여러 원시형 데이터타입이 섞인 하나의 타입
● 테이블과 비슷 . 로우 수가 1 개인 테이블 형태임
● 서로 다른 유형의 데이터타입이 죽 연결된 형태
● 커서형 , 사용자 정의형 , 테이블 형 레코드로 구분 가능
● 커서형 레코드 커서 변수 형태
02
사용자 정의형 레코드
레코드
● 사용자가 직접 레코드를 정의 , 선언해서 사용
● 구문
TYPE 레코드명 IS RECORD ( 필드명 1 필드 1 타입 [[NOT NULL] := 디폴트값 ], 필드명 2 필드 2 타입 [[NOT NULL] := 디폴트값 ], … );
레코드변수명 레코드명 ;
● 레코드 필드 사용 : 레코드변수명 . 필드명 형태로 접근 가능
02
테이블형 레코드
레코드
● 특정 테이블의 컬럼 전체를 레코드로 선언해 사용 가능
● 구문
레코드변수명 테이블명 %ROWTYPE;
● 사용 예
vr_dep departments%ROWTYPE; -- 테이블형 레코드 변수 선언
-- 부서 테이블의 모든 정보를 레코드 변수에 넣는다 . SELECT * INTO vr_dep FROM departments WHERE department_id = 20;
02
커서형 레코드
레코드
● 커서를 레코드 변수로 받아 사용 : 커서명 %ROWTYPE
● 사용 예
-- 커서 선언 CURSOR c1 IS SELECT department_id, department_name, parent_id, manager_id FROM departments; -- 커서형 레코드 변수 선언 vr_dep c1%ROWTYPE;
02
중첩 레코드
레코드
● 레코드의 한 필드의 타입이 또 다른 레코드 형인 경우
● 중첩 레코드의 필드 접근 방식
ㆍ 일반 필드 : 레코드 1. 필드명
ㆍ 중첩 필드 : 레코드 1. 레코드 2. 필드명
03
컬렉션이란 ?
컬렉션
● 레코드와 유사하지만 같은 데이터 타입의 요소로 구성되며 여러 로우를 가진 타입
● 객체지향 프로그램의 클래스와 유사 생성자와 컬렉션 메소드 사용
● 3 가지 타입의 컬렉션 존재
● 연관배열 (Associative Array)
● VARRAY
● 중첩 테이블 (Nested Table)
03
연관배열 (Associative Array)
컬렉션
● 키 - 값으로 구성 ( 키를 인덱스라고도 부르기 때문에 Index-by 테이블 이라고도 함 )
● 전화번호부와 비슷
● 생성구문
TYPE 연관 _ 배열명 IS TABLE OF 연관 _ 배열 _ 값타입 INDEX BY 인덱스타입 ;
● 인덱스타입으로는 문자형과 PLS_INTEGER 타입이 올 수 있음
● 연관 _ 배열 _ 변수명 ( 인덱스 ) 형태로 접근
● 크기 제한이 없음
03
VARRY (Variable-Size Array)
컬렉션
● 선언 시 크기 지정하므로 크기 제한 지정한 크기보다 많은 요소 입력 시 오류 발생
● 인덱스타입은 숫자형만 가능하며 자동 채번됨 최소값은 1
● 생성구문
TYPE VARRAY 명 IS VARRAY( 최대크기 ) OF 요소값 _ 타입 ;
● 생성자를 사용해 초기화 초기화 전에는 접근 불가
● 변수명 ( 인덱스 ) 형태로 접근
● 일반 테이블의 컬럼 타입으로 사용 가능
CREATE OR REPLACE TYPE 구문으로 VARRAY 형의 TYPE 객체 생성 후 사용
03
중첩 테이블 (Nested Table)
컬렉션
● 크기 제한이 없고 숫자형 인덱스만 사용 가능하며 생성자를 사용해 초기화
● 연관 배열보다는 VARRAY 와 유사
● 생성구문
TYPE 중첩 _ 테이블명 IS TABLE OF 값타입 ;
● 일반 테이블의 컬럼 타입으로 사용 가능
CREATE OR REPLACE TYPE 구문으로 중첩테이블 형의 TYPE 객체 생성 후 사용
● 컬렉션 요소에 접근해 값을 가져오거나 수정 , 삭제하는 일련의 빌트인 메소드
03
컬렉션 메소드
컬렉션
메소드명 메소드 타입 설명
DELETE 프로시저 컬렉션 요소를 삭제한다 .
TRIM 프로시저 VARRAY 나 중첩 테이블의 끝에서 요소를 삭제한다 .
EXTEND 프로시저 VARRAY 나 중첩 테이블의 끝에 요소를 추가한다 .
EXISTS 함수 VARRAY 나 중첩 테이블에 특정 요소가 존재하면 TRUE 를 반환한다 .
FIRST 함수 컬렉션이 첫 번째 인덱스를 반환한다 .
LAST 함수 컬렉션의 마지막 인덱스를 반환한다 .
COUNT 함수 컬렉션의 요소의 총 수를 반환한다 .
LIMIT 함수 컬렉션이 가질 수 있는 요소의 최대수를 반환한다 .
PRIOR 함수 특정 인덱스 이전의 인덱스를 반환한다 .
NEXT 함수 특정 인덱스 다음의 인덱스를 반환한다 .
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_ 데이터 타입 , … );
03
다차원 컬렉션
컬렉션
● 컬렉션의 요소 타입이 VARCHAR2, NUMBER 같은 빌트인 타입이 아닌 또 다른 컬렉션인 경우
컬렉션 안에 또 다른 컬렉션이 있는 형태라서 다차원 컬렉션이라고 함
● 사용 예
-- 첫 번째 VARRAY 타입선언 TYPE va_type1 IS VARRAY(5) OF NUMBER; -- va_type1 을 요소 타입으로 하는 VARRAY 타입 선언 TYPE va_type11 IS VARRAY(3) OF va_type1;
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 타입컬럼 );
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 -– 중첩테이블의 경우 별도의 저장공간 명시 ;
03
컬렉션 타입별 비교
컬렉션
구분 연관 배열 VARRAY 중첩 테이블
생성구문 TYPE 명칭 IS TABLE OF 값타입 INDEX BY 인덱스타입
TYPE 명칭 IS VARRAY( 최대크기 ) OF
값타입 ;
TYPE 명칭 IS TABLE OF 값타입 ;
크기제한 없음 있음 없음
생성자 없음 있음 있음
인덱스타입 숫자 , 문자 숫자 숫자
사용자 정의타입 불가 선언가능 선언가능
테이블컬럼 불가 사용가능 사용가능
TABLE 함수 불가 사용가능 사용가능
DML 부분처리 불가 불가 가능