오라클 sql과 pl/sql을 다루는 기술
TRANSCRIPT
The Technique of Java Programming
들어가기
이 자료는 교육 등 비영리 목적으로만 사용해야 합니다 !!!!
만든사람 및 책 소개
• 오라클 SQL과 PL/SQL을 다루는 기술 : 오라클 프로그래밍 , 현장 밀착 입문서는 따로 있다 !
• 홍형경
• 주요 저서 : - 〈뇌를 자극하는 오라클 프로그래밍 SQL&PL/SQL
- Head First 시리즈를 비롯해 다수의 책 번역
임시 테이블과 TABLE 함수셋째 마당 . 업무 효율을 높이는 실전 PL/SQL 프로그래밍
14장
01 오라클도 지원 가능한 임시 테이블
임시 테이블
TABLE 함수
02
임시 테이블과 TABLE 함수
03
01
임시테이블 ?
오라클도 지원 가능한 임시 테이블
● 일반적으로 영구적이 아닌 특정 조건에 따라 일시적으로만 데이터가 존재하는 테이블
● MSSQL 의 경우 , 프로시저 내에서 임시테이블을 만들어 사용 가능
● 또한 프로시저가 종료되면 임시테이블은 자동 삭제 , 프로시저 실행 시 임시테이블을
SELECT 한 결과가 출력
● 오라클에서는 MSSQL 처럼 프로시저 내에서 임시테이블을 만들어 사용할 수 없으며
프로시저를 실행해서 SELECT 한 결과를 출력할 수 없음
● 하지만 오라클에서도 임시 테이블을 만들어 비슷한 기능 구현이 가능
02
오라클의 임시테이블
임시 테이블
● 오라클에서 사용하는 임시 테이블 Global Temporary Table, 일명 GTT
● GLOBAL 이 붙는 이유는 전역 변수와 비슷한 개념
● 트랜잭션 GTT 와 세션 GTT 가 있음
02
트랜잭션 GTT
임시 테이블
● 트랜잭션이 살아있는 동안만 데이터가 유지되는 GTT
● COMMIT 문을 실행하면 데이터가 모두 없어짐
● 구문
CREATE GLOBAL TEMPORARY TABLE 테이블명 ( 컬럼 1 데이터타입 , … … ) [ ON COMMIT DELETE ROWS ] ;
● ON COMMIT DELETE ROWS COMMIT 시에 데이터를 삭제하라는 의미 , 디폴트로 생략가능
02
세션 GTT
임시 테이블
● 같은 세션내에서는 데이터가 유지되는 GTT
● 구문
CREATE GLOBAL TEMPORARY TABLE 테이블명 ( 컬럼 1 데이터타입 , … … ) ON COMMIT PRESERVE ROWS;
● ON COMMIT PRESERVE ROWS COMMIT 시에도 데이터를 유지하라는 의미
● 세션이 종료되면 데이터가 사라짐
02
GTT 의 제한 사항
임시 테이블
● 파티션 GTT 를 만들 수 없다
● GTT 에는 외래키를 만들 수 없다
● GTT 에는 병렬로 UPDATE, DELETE, MERGE 문을 실행할 수 없다
● GTT 컬럼으로 중첩 테이블 타입을 사용할 수 없다
● GTT 에도 인덱스는 만들 수 있다
03
TABLE 함수
TABLE 함수
● TABLE 연산자를 사용해 실제 테이블인양 FROM 절에 넣어 사용 가능
● TABLE 함수는 여러 개의 로우를 가진 컬렉션을 반환
● 컬렉션 중 VARRAY 와 중첩테이블만 반환 가능
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;
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 …
03
파이프라인 테이블 함수
TABLE 함수
● 일반 테이블 함수는 반환하는 컬렉션에 데이터를 모두 담은 후 해당 컬렉션을 반환하나 ,
파이프라인 테이블 함수는 컬렉션에 데이터를 담는 즉시 반환이 가능
● 컬렉션을 반환하는 함수 생성 시 PIPELINED 와 PIPE ROW 키워드 사용
● 함수의 루프문 내에서 PIPE ROW( 반환 데이터 ); 를 명시해 데이터 반환
● 대량의 데이터 반환 시 파이프라인 테이블 함수의 성능이 훨씬 좋음
03
파이프라인 테이블 함수
TABLE 함수
● 구문
CREATE OR REPLACE FUNCTION 함수명 ( 매개변수 리스트 … ) RETURN 컬렉션타입 PIPELINED IS … BEGIN … LOOP … PIPE ROW ( 반환 데이터 ); END LOOP; RETURN; END;
04
로우를 컬럼으로 변환하는 방법
현장 노하우
● DECODE 나 CASE 전통적 방법
● WITH 문
● PIVOT 절
SELECT … FROM ( 피벗 _ 대상 _SELECT 문 ) PIVOT ( 집계함수 ( 표현식 ) FOR [ ( ] 피벗대상 _ 컬럼 [, 피벗대상 _ 컬럼 2, …. ) ] IN ( 컬럼으로 _ 올릴 _ 피벗값 _ 리스트 ) );
04
컬럼을 로우로 변환하는 방법
현장 노하우
● UNION ALL
● UNPIVOT 절 PIVOT 절과 반대
● DBMS_SQL
● 파이프라인 테이블 함수