1HOON
논리적 코딩
1HOON
전체 방문자
오늘
어제
  • HOME (186)
    • ☕️ JAVA (28)
      • WhiteShip Java LIVE Study (6)
      • Effective JAVA (10)
    • 🔮 KOTLIN (4)
    • 🌱 SPRING (51)
      • 스프링 인 액션 (22)
      • JPA (18)
    • ☕️ JAVASCRIPT (6)
    • 📃 DATABASE (40)
      • ORACLE (37)
      • MSSQL (2)
    • 🐧 LINUX (4)
    • 🐳 DOCKER (5)
    • 🐙 KUBERNETES (4)
    • 🏗️ ARCHITECTURE (8)
    • 📦 ETC (26)
      • TOY PROJECT (5)
      • RECRUIT (1)
      • 그냥 쓰고 싶어서요 (14)
    • 🤿 DEEP DIVE (1)
    • 🚽 Deprecated (9)
      • PYTHON (3)
      • AWS (2)
      • HTTP 완벽가이드 (3)
      • WEB (1)

블로그 메뉴

  • 홈
  • 방명록
  • 관리

인기 글

최근 글

티스토리

hELLO · Designed By 정상우.
1HOON

논리적 코딩

[PL/SQL] 파이프라인 테이블함수
📃 DATABASE/ORACLE

[PL/SQL] 파이프라인 테이블함수

2018. 3. 30. 14:44

파이프라인 테이블함수(PIPELINED TABLE FUNCTION)


1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE OR REPLACE FUNCTION 함수명 (매개변수)
    RETURN 컬렉션타입
    PIPELINED
IS
    ...
BEGIN
    ...
    LOOP
    
        PIPE ROW(반환데이터);
    END LOOP;
    RETURN;
END;
Colored by Color Scripter
cs


예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE OR REPLACE FUNCTION FN_CH14_PIPE_TABLE (P_N NUMBER)
    RETURN CH14_NUM_AT
    PIPELINED
IS
    VNT_RETURN  CH14_NUM_AT := CH14_NUM_AT();
BEGIN
    FOR IDX IN 1..P_N
    LOOP
        VNT_RETURN.EXTEND;
        VNT_RETURN(IDX) := IDX;
        
        PIPE ROW(VNT_RETURN(IDX));
    END LOOP;
    RETURN;
END;
Colored by Color Scripter
cs



1
2
SELECT *
  FROM TABLE(FN_CH14_PIPE_TABLE(10));
cs



다른 테이블 함수와 다를 것이 없어보인다. 하지만, 데이터의 양이 많아지면 속도차이를 실감할 수 있다.


아래는 사용자정의 테이블함수를 실행하는 쿼리문과 실행결과다.

1
2
SELECT *
  FROM TABLE(FN_CH14_TABLE1(4000000));
cs



아래는 파이프라인 테이블함수 쿼리문과 실행결과다.

1
2
SELECT *
  FROM TABLE(FN_CH14_PIPE_TABLE(4000000));
cs



확실히 파이프라인의 성능이 월등하며, 같은 조건과 목적이라면 파이프라인 테이블함수를 사용하는 것이 성능상 우위가 있다.


또, 파이프라인 테이블함수는 루프 중간에 PIPE ROW문을 사용해 컬렉션 타입을 반환하므로 루프 안에서 여러번 사용하면 데이터 역시 여러번 반환된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
CREATE OR REPLACE FUNCTION FN_CH14_PIPE_TABLE2 (P_CUR CH14_EMPTY_PKG.EMP_REFC_T)
    RETURN CH14_CMPLX_NT
    PIPELINED
IS
    V_CUR       P_CUR%ROWTYPE;
    VNT_RETURN  CH14_CMPLX_NT := CH14_CMPLX_NT();
BEGIN
    LOOP
        FETCH P_CUR INTO V_CUR;
        EXIT WHEN P_CUR%NOTFOUND;
        
        VNT_RETURN.EXTEND();
        VNT_RETURN(VNT_RETURN.LAST) := CH14_OBJ_TYPE1(NULL, NULL, NULL, NULL);
        
        VNT_RETURN(VNT_RETURN.LAST).VARCHAR_COL1 := V_CUR.EMP_NAME;
        VNT_RETURN(VNT_RETURN.LAST).VARCHAR_COL2 := V_CUR.PHONE_NUMBER;
        VNT_RETURN(VNT_RETURN.LAST).NUM_COL      := V_CUR.EMPLOYEE_ID;
        VNT_RETURN(VNT_RETURN.LAST).DATE_COL     := V_CUR.HIRE_DATE;
        PIPE ROW(VNT_RETURN(VNT_RETURN.LAST));
        
        VNT_RETURN(VNT_RETURN.LAST).VARCHAR_COL1 := V_CUR.JOB_ID;
        VNT_RETURN(VNT_RETURN.LAST).VARCHAR_COL2 := V_CUR.EMAIL;
        PIPE ROW(VNT_RETURN(VNT_RETURN.LAST));
    END LOOP;
    RETURN;
END;
Colored by Color Scripter
cs



1
2
3
4
5
6
SELECT *
  FROM TABLE(FN_CH14_PIPE_TABLE2(CURSOR(
                                       SELECT *
                                         FROM EMPLOYEES
                                        WHERE ROWNUM < 6
                                       )));
cs



실행결과를 보게되면, 같은 NUM_COL, DATE_COL 값을 가진 행이 하나씩 더 반환된 것을 알 수있다.


반응형
저작자표시 비영리 변경금지 (새창열림)

'📃 DATABASE > ORACLE' 카테고리의 다른 글

[PL/SQL] DBMS_JOB  (0) 2018.04.03
[PL/SQL] 테이블 함수  (0) 2018.03.29
[PL/SQL] 임시테이블(GTT)  (0) 2018.03.28
[PL/SQL] DBMS_SQL (3) : 응용활용  (0) 2018.03.27
[PL/SQL] DBMS_SQL (2) : 기본활용  (0) 2018.03.26
    '📃 DATABASE/ORACLE' 카테고리의 다른 글
    • [PL/SQL] DBMS_JOB
    • [PL/SQL] 테이블 함수
    • [PL/SQL] 임시테이블(GTT)
    • [PL/SQL] DBMS_SQL (3) : 응용활용
    1HOON
    1HOON

    티스토리툴바