[ ◎ 여러 레코드 Return하기 ]
☞ 정의 |
|
1. Function의 기본은 값 하나만 넘기자만
PIPE를 이용하면 Table단위나 Row_Type단위로 값을 리턴할 수 있다.
2. PipeLined 라고 불리는 이유는 데이터를 찾는 즉시 바로 바로 전송해주기 때문이다. |
|
|
|
☞ 생성 방법 1 - Package 안에 Type을 생성한 예제 |
|
-- Package 헤더 생성
CREATE OR REPLACE PACKAGE myDemoPack IS
-- 레코드 타입 TYPE myObjectFormat IS RECORD ( A INT, B DATE, C VARCHAR2(25) );
-- 테이블 타입 TYPE myTableType IS TABLE OF myObjectFormat;
FUNCTION prodFunc RETURN myTableType PIPELINED; --pipelined선언
END myDemoPack;
-- Package 바디 생성
CREATE OR REPLACE PACKAGE BODY myDemoPack AS FUNCTION prodFunc RETURN myTableType PIPELINED IS
CURSOR sel_cur IS SELECT ROWNUM, SYSDATE+ROWNUM, 'Row=' || ROWNUM FROM DUAL CONNECT BY LEVEL <= 5;
BEGIN FOR myObjectFormat IN sel_cur LOOP PIPE ROW (myObjectFormat); --바로바로 리턴 END LOOP;
RETURN; --이때 RETURN는 사실 의미 없음 END; END;
|
☞ 생성 방법 2 - Package 안에 Type을 생성한 예제 오류 발생.. 잘 될거 같은데.. 안됨.. 오류에 원인을 알 수 없음. |
|
2. 패지지 생성 -- 패지키 헤더 생성
CREATE OR REPLACE PACKAGE myDemoPack IS
-- 레코드 타입 TYPE myObjectFormat IS RECORD ( A INT, B DATE, C VARCHAR2(25) ); -- 테이블 타입 TYPE myTableType IS TABLE OF myObjectFormat;
FUNCTION prodFunc RETURN myTableType PIPELINED; --pipelined선언
END myDemoPack;
--패키지 바디 생성 CREATE OR REPLACE PACKAGE BODY myDemoPack AS FUNCTION prodFunc RETURN myTableType PIPELINED IS BEGIN FOR i IN 1 .. 5 LOOP PIPE ROW (myObjectFormat(i, SYSDATE+I, 'Row' || i)); --바로바로 리턴 END LOOP; RETURN; --이때 RETURN는 사실 의미 없음 END; END;
|
|
3. 쿼리 조회 SELECT * FROM TABLE(myDemoPack.prodFunc()); |
|
| |
참고URL : http://cafe.naver.com/dbmodeler/93