fn_ch14_pipe_table2 함수 역시 일반 테이블 함수인 fn_ch14_table2를 변형해 만든 파이프라인 함수다. fn_ch14_pipe_table2 함수는 PIPE ROW 문을 이용해 루프 내에서 두 번 값을 반환하고 있는데, 두 번째 반환 전에 VARCHAR_COL1, VARCHAR_COL2에 사원 테이블의 JOB_ID와 EMAIL 컬럼 데이터를 넣었다. 이렇게 하면 어떤 형태로 결과가 반환되는지 확인해 보자.
입력
SELECT *
FROM TABLE( fn_ch14_table2 ( CURSOR ( SELECT * FROM EMPLOYEES WHERE ROWNUM < 6)
));
결과
VARCHAR_COL1 VARCHAR_COL2 NUM_COL DATE_COL
-------------------- --------------------- ---------------------
William Smith 011.44.1343.629268 171 2000-02-23
SA_REP WSMITH 171 2000-02-23
Elizabeth Bates 011.44.1343.529268 172 2000-06-24
SA_REP EBATES 172 2000-06-24
Sundita Kumar 011.44.1343.329268 173 2001-06-21
SA_REP SKUMAR 173 2001-06-21
Ellen Abel 011.44.1644.429267 174 1998-05-11
SA_REP EABEL 174 1998-05-11
Alyssa Hutton 011.44.1644.429266 175 1999-09-19
SA_REP AHUTTON 175 1999-09-19
5개의 행이 반환되어야 하는데 총 10개의 행이 반환되었는데 그 이유는 PIPE ROW문을 써서 두 번씩 반환했기 때문이다. 짝수 번 행의 데이터를 보면 VARCHAR_COL1, VARCHAR_COL2 컬럼 값에 JOB_ID, EMAIL 데이터가 출력됐는데 결국 1과 2행의 데이터는 실제로는 사번이 171인 William Smith라는 한 사람의 정보임을 알 수 있다. 이렇게 파이프라인 함수를 사용하면 컬럼을 로우로 변환하는 효과를 줄 수 있다.
이 장은 MSSQL 프로시저에서 임시 테이블을 만들어 프로시저 수행 결과로 임시 테이블의 데이터를 출력할 수 있는 MSSQL 프로시저의 기능을 오라클 프로시저에서도 구현이 가능한가? 라는 질문으로 시작해서 이와 유사한 기능인 GTT와 테이블 함수, 나아가 파이프라인 테이블 함수까지 살펴 봤다.