오라클 sql과 pl/sql을 다루는 기술

17
The Technique of Java Programming

Upload: chariehong

Post on 10-Aug-2015

176 views

Category:

Software


11 download

TRANSCRIPT

Page 1: 오라클 SQL과 PL/SQL을 다루는 기술

The Technique of Java Programming

Page 2: 오라클 SQL과 PL/SQL을 다루는 기술

들어가기

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

Page 3: 오라클 SQL과 PL/SQL을 다루는 기술

만든사람 및 책 소개

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

• 홍형경

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

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

Page 4: 오라클 SQL과 PL/SQL을 다루는 기술

임시 테이블과 TABLE 함수셋째 마당 . 업무 효율을 높이는 실전 PL/SQL 프로그래밍

14장

Page 5: 오라클 SQL과 PL/SQL을 다루는 기술

01 오라클도 지원 가능한 임시 테이블

임시 테이블

TABLE 함수

02

임시 테이블과 TABLE 함수

03

Page 6: 오라클 SQL과 PL/SQL을 다루는 기술

01

임시테이블 ?

오라클도 지원 가능한 임시 테이블

● 일반적으로 영구적이 아닌 특정 조건에 따라 일시적으로만 데이터가 존재하는 테이블

● MSSQL 의 경우 , 프로시저 내에서 임시테이블을 만들어 사용 가능

● 또한 프로시저가 종료되면 임시테이블은 자동 삭제 , 프로시저 실행 시 임시테이블을

SELECT 한 결과가 출력

● 오라클에서는 MSSQL 처럼 프로시저 내에서 임시테이블을 만들어 사용할 수 없으며

프로시저를 실행해서 SELECT 한 결과를 출력할 수 없음

● 하지만 오라클에서도 임시 테이블을 만들어 비슷한 기능 구현이 가능

Page 7: 오라클 SQL과 PL/SQL을 다루는 기술

02

오라클의 임시테이블

임시 테이블

● 오라클에서 사용하는 임시 테이블 Global Temporary Table, 일명 GTT

● GLOBAL 이 붙는 이유는 전역 변수와 비슷한 개념

● 트랜잭션 GTT 와 세션 GTT 가 있음

Page 8: 오라클 SQL과 PL/SQL을 다루는 기술

02

트랜잭션 GTT

임시 테이블

● 트랜잭션이 살아있는 동안만 데이터가 유지되는 GTT

● COMMIT 문을 실행하면 데이터가 모두 없어짐

● 구문

CREATE GLOBAL TEMPORARY TABLE 테이블명 ( 컬럼 1 데이터타입 , … … ) [ ON COMMIT DELETE ROWS ] ;

● ON COMMIT DELETE ROWS COMMIT 시에 데이터를 삭제하라는 의미 , 디폴트로 생략가능

Page 9: 오라클 SQL과 PL/SQL을 다루는 기술

02

세션 GTT

임시 테이블

● 같은 세션내에서는 데이터가 유지되는 GTT

● 구문

CREATE GLOBAL TEMPORARY TABLE 테이블명 ( 컬럼 1 데이터타입 , … … ) ON COMMIT PRESERVE ROWS;

● ON COMMIT PRESERVE ROWS COMMIT 시에도 데이터를 유지하라는 의미

● 세션이 종료되면 데이터가 사라짐

Page 10: 오라클 SQL과 PL/SQL을 다루는 기술

02

GTT 의 제한 사항

임시 테이블

● 파티션 GTT 를 만들 수 없다

● GTT 에는 외래키를 만들 수 없다

● GTT 에는 병렬로 UPDATE, DELETE, MERGE 문을 실행할 수 없다

● GTT 컬럼으로 중첩 테이블 타입을 사용할 수 없다

● GTT 에도 인덱스는 만들 수 있다

Page 11: 오라클 SQL과 PL/SQL을 다루는 기술

03

TABLE 함수

TABLE 함수

● TABLE 연산자를 사용해 실제 테이블인양 FROM 절에 넣어 사용 가능

● TABLE 함수는 여러 개의 로우를 가진 컬렉션을 반환

● 컬렉션 중 VARRAY 와 중첩테이블만 반환 가능

Page 12: 오라클 SQL과 PL/SQL을 다루는 기술

03

사용자 정의 테이블 함수 사용 예

TABLE 함수

● 컬렉션 타입 선언

CREATE OR REPLACE TYPE ch14_num_nt IS TABLE OF NUMBER;

● ch14_num_nt 를 반환하는 함수 생성

CREATE OR REPLACE FUNCTION fn_ch14_table1 ( p_n NUMBER ) RETURN ch14_num_nt -- 컬렉션 타입 반환 IS -- 컬렉션 변수 선언 ( 컬렉션 타입이므로 초기화를 한다 ) vnt_return ch14_num_nt := ch14_num_nt(); BEGIN -- 1 부터 입력 매개변수인 p_n 만큼 숫자를 넣는다 . FOR i IN 1..p_n LOOP vnt_return.EXTEND; vnt_return(i) := i ; END LOOP;

RETURN vnt_return; -- 컬렉션 타입을 반환한다 . END;

Page 13: 오라클 SQL과 PL/SQL을 다루는 기술

03

사용자 정의 테이블 함수 사용 예

TABLE 함수

● fn_ch14_table1 함수 사용 SELECT fn_ch14_table1 (10) FROM DUAL;

FN_CH14_TABLE1(10) -------------------------------------------------------- ORA_USER.CH14_NUM_NT(1,2,3,4,5,6,7,8,9,10)

● TABLE 함수를 사용하면 실제 테이블 형태로 결과가 출력

SELECT * FROM TABLE(fn_ch14_table1 (10));

COLUMN_VALUE -------------------- 1 2 …

Page 14: 오라클 SQL과 PL/SQL을 다루는 기술

03

파이프라인 테이블 함수

TABLE 함수

● 일반 테이블 함수는 반환하는 컬렉션에 데이터를 모두 담은 후 해당 컬렉션을 반환하나 ,

파이프라인 테이블 함수는 컬렉션에 데이터를 담는 즉시 반환이 가능

● 컬렉션을 반환하는 함수 생성 시 PIPELINED 와 PIPE ROW 키워드 사용

● 함수의 루프문 내에서 PIPE ROW( 반환 데이터 ); 를 명시해 데이터 반환

● 대량의 데이터 반환 시 파이프라인 테이블 함수의 성능이 훨씬 좋음

Page 15: 오라클 SQL과 PL/SQL을 다루는 기술

03

파이프라인 테이블 함수

TABLE 함수

● 구문

CREATE OR REPLACE FUNCTION 함수명 ( 매개변수 리스트 … ) RETURN 컬렉션타입 PIPELINED IS … BEGIN … LOOP … PIPE ROW ( 반환 데이터 ); END LOOP; RETURN; END;

Page 16: 오라클 SQL과 PL/SQL을 다루는 기술

04

로우를 컬럼으로 변환하는 방법

현장 노하우

● DECODE 나 CASE 전통적 방법

● WITH 문

● PIVOT 절

SELECT … FROM ( 피벗 _ 대상 _SELECT 문 ) PIVOT ( 집계함수 ( 표현식 ) FOR [ ( ] 피벗대상 _ 컬럼 [, 피벗대상 _ 컬럼 2, …. ) ] IN ( 컬럼으로 _ 올릴 _ 피벗값 _ 리스트 ) );

Page 17: 오라클 SQL과 PL/SQL을 다루는 기술

04

컬럼을 로우로 변환하는 방법

현장 노하우

● UNION ALL

● UNPIVOT 절 PIVOT 절과 반대

● DBMS_SQL

● 파이프라인 테이블 함수