[oracle, 오라클] Table Function & Pipelined Table 테이블 함수, 파이프라인드 함수

업무를 수행하다 보면 Result Set 전체를 인자 값으로 받아서 결과를 Return하고자 하는 경우가 종종 있다. 이때 Oracle Table Function을 사용하면 이를 간단히 해결할 수 있다.

Oracle Table Function은 Result Set(Multi column + Multi Row)의 형태를 인자 값으로 받아들여 값을 Return할 수 있는 PL/SQL Function이고, Pipelined Table Function은 Oracle Table Function과 마찬가지로 Result Set의 형태로 인자 값을 제공하거나 전체 집합을 한번에 처리하지 않고 Row 단위로 한 건씩 처리하는 Function으로 PL/SQL의 부분범위 처리를 가능하게 해주는 Function이다.

그럼 Table Function과 Pipelined Table Function을 살펴보도록 하자.

 

 

Table Function은 어떻게 사용하는가?

Table Function은 Function으로 정의되며 Function의 Input으로 Row들의 집합을 취할 수 있고 출력으로 Row들의 집합을 생성할 수 있다.

Query의 FROM 절에서 'TABLE'이라는 키워드로 접근 가능하며 Return Type은 Nested Table 또는 Varray 형태이다. 간단한 예제를 통해 Table Function을 어떻게 사용하는지 확인해 보자.

  • Return 받을 행을 받는 Object Type을 생성
1
2
3
4
5
6
7
CREATE OR REPLACE TYPE obj_type AS object
( c1 INT,
  c2 INT
);
/
 
유형이 생성되었습니다.

 

  • Collection Type 생성
1
2
3
4
5
CREATE OR REPLACE TYPE table_type
AS TABLE OF obj_type;
/
 
유형이 생성되었습니다.

 

  • Table Function을 생성 - 원하는 만큼의 Row를 출력하는 Function
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE OR REPLACE FUNCTION table_func (p_start int, p_end int)
  RETURN table_type
  IS
    v_type TABLE_TYPE := table_type();
  BEGIN
   
    FOR i IN p_start..p_end LOOP
      v_type.extend;
      v_type(i) := obj_type(i,i);
    END LOOP;
     
    RETURN v_type;
 END;
 /
 
함수가 생성되었습니다.

 

  • FROM 절에 'TABLE'이라는 Keyword를 이용해 아래와 같은 결과 추출
1
2
3
4
5
6
7
8
SELECT * FROM TABLE(table_func(1,3));
 
 
   C1         C2
----- ----------
    1          1
    2          2
    3          3

 

 

Pipelined Table Function은 어떻게 사용하는가?

다음은 Pipelined Table Function에 대해 알아보도록 하자.

Pipelined Table Function은 한 행 단위로 즉시 값을 리턴하는 함수로, 9i 이상에서만 가능하며 수행 속도가 향상되었고 부분범 위 처리가 가능하다.

간단한 예제를 통해 Pipelined Table Function을 어떻게 사용하는지 확인해 보자.

 

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

  • Return 받을 행을 받는 Object Type을 생성
1
2
3
4
5
6
7
CREATE OR REPLACE TYPE obj_type1 AS object
( c1 INT,
  c2 INT
 );
 /
  
 유형이 생성되었습니다.

 

  • Collection Type 생성
1
2
3
4
5
CREATE OR REPLACE TYPE table_type1
AS TABLE OF obj_type1;
/
 
유형이 생성되었습니다.

 

  • Pipelined Table Function을 생성 - 원하는 만큼의 Row를 출력하는 Function
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE OR REPLACE FUNCTION pipe_table_func(p_start INT, p_end INT)
  RETURN table_type1
  PIPELINED
  IS
    v_type obj_type1;
  BEGIN
    FOR i IN p_start..p_end LOOP
      v_type := obj_type1(i, i);
      PIPE ROW(v_type);
    END LOOP;
  END;
 /
  
함수가 생성되었습니다.

 

  • FROM 절에 'TABLE'이라는 Keyword를 이용해 수행한다면 아래와 같은 결과 추출
1
2
3
4
5
6
7
SELECT * FROM TABLE(pipe_table_func(1,3));
 
   C1         C2
----- ----------
    1          1
    2          2
    3          3

Pipelined Table Function은 하나의 Row를 받아서 바로 처리하므로 수행 속도가 빠르다. 이에 비해 Table Function은 전체 Row가 처리된 이후에 동작되므로 Pipelined Table Function에 비해 이전 처리된 Row를 Cache할 Memory를 더 요구하게 된다.

 

 

Table Function & Pipelined Table Function을 비교하자

위에서 생성한 Function을 이용해 Table Function & Pipelined Table Function을 확인할 수 있다.

 

  • Table Function만을 사용한 table_func에 큰 Row를 Return하는 Test
1
2
-- 커서가 깜빡거린 이후 일정 시간 경과 후(모든 결과가 계산됨) Row 가 출력된다.
SELECT * FROM TABLE(table_func(1, 1000000));

 

  • Pipeline Table Function만을 사용한 table_func에 큰 Row를 Return하는 Test
1
2
-- 한 Row씩 처리하므로 바로 결과 값들이 출력되기 시작
SELECT * FROM TABLE(pipe_table_func(1, 1000000));

 

이처럼 Table Function은 전체 데이터 처리를 수행하지만 Pipelined Table Function은 부분 범위 처리를 수행한다는 것을 확인할 수 있다.

우리가 Oracle 10g부터 사용하는 dbms_xplan Package의 Function들도 Pipelined Table Function으로 구현되어 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
EXPLAIN PLAN FOR SELECT * FROM emp;
 
해석되었습니다.
 
 
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
 
PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------
Plan hash value: 3956160932
 
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |    15 |   555 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| EMP  |    15 |   555 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------

 

이처럼 Pipelined Table Function을 적재적소에 사용해 강력 한 PL/SQL Query를 잘 이용하길 바란다.

[출처] http://www.gurubee.net/lecture/2238

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
공지 오라클 기본 샘플 데이터베이스 졸리운_곰 2014.01.02 86914
공지 [SQL컨셉] 서적 "SQL컨셉"의 샘플 데이타 베이스 SAMPLE DATABASE of ORACLE 가을의 곰을... 2013.02.10 79208
공지 [G_SQL] Sample Database 가을의 곰을... 2012.05.20 95940
102 [MYSQL] 테이블 스키마 설계 고려사항 졸리운_곰 2022.12.03 1332
101 [MySQL] "아는 만큼 빨라진다" 마이SQL 성능 튜닝 팁 10가지 file 졸리운_곰 2022.11.29 1064
100 [Mysql] mysql에서 json 다루기 file 졸리운_곰 2022.08.02 1222
99 [MySQL] MySQL 에서 JSON Data사용하기 졸리운_곰 2022.08.02 1390
98 [MySQL] 관리자 root , admin 계정 추가 : MySQL 관리자 계정 추가 졸리운_곰 2021.09.26 9257
97 [MySQL] mysql 에서 컬럼과 로우 바꾸기, 행과 열 바꾸기 How to Transpose Rows to Columns Dynamically in MySQL file 졸리운_곰 2021.09.13 1037
96 [MySQL] MySQL ROLLUP , summary, 부분합 구하기 file 졸리운_곰 2021.09.01 1640
95 [mysql] 인덱스 정리 및 팁 file 졸리운_곰 2020.12.04 1397
94 [MySQL] 복제 지연 원인 및 해결 (reason for mysql replication lag/delay) file 졸리운_곰 2020.07.18 1409
93 MySQL Replication(복제) file 졸리운_곰 2020.07.18 1805
92 MySQL replication을 해보자 졸리운_곰 2020.07.18 1696
91 MySQL Replication(복제) - 단방향 이중화 file 졸리운_곰 2020.07.18 856
90 [MySQL] 행, 열 바꾸어 출력하기 CASE ~ AS file 졸리운_곰 2020.06.13 1040
89 [MySQL] 피벗 - 로우 데이터를 컬럼으로 옮기기 file 졸리운_곰 2020.06.13 1365
88 MySQL (or MariaDB) 에서 row 데이터를 column 으로 변경하기 졸리운_곰 2020.06.13 1342
87 [mysql] 운용 application 정보 (proxy, middle ware) 등: awesome-mysql file 졸리운_곰 2020.05.16 26550
86 [MySQL] 10장 여러 개의 테이블 이용하기 file 졸리운_곰 2020.05.16 1137
85 [MySQL] DB에 중복된 값의 개수를 확인하고 싶다. 졸리운_곰 2020.05.06 1187
84 sqlRelay(Mysql DB Pooling) 졸리운_곰 2020.02.17 1458
83 [참고자료] 공개커넥션풀 프로그램 졸리운_곰 2020.02.17 1991
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED