제목 그대로 function에서 muti_row를 리턴받자...입니다.
오라클 9i 부터는 function에서 multi_row를 return 받을수 있습니다.
예제)
CREATE OR REPLACE PACKAGE ZZ_PKG
AS
-- Return받을 Record 선언
-- Package를 사용하지 않으려면 Object에 Type이 미리 선언되어야 합니다
TYPE ZZ_TYPE_ITEM_MASTER IS RECORD
(
ITEM_ID IDB_ITEM_MASTER.ITEM_ID%TYPE
,ITEM_NAME IDB_ITEM_MASTER.ITEM_NAME%TYPE
);
-- Type재정의
TYPE SET_ITEM_MASTER IS TABLE OF ZZ_TYPE_ITEM_MASTER;
-- 함수선언(Return의 Pipelined 기술)
FUNCTION ZZ_TEST
RETURN SET_ITEM_MASTER PIPELINED;
END ZZ_PKG;
/
CREATE OR REPLACE PACKAGE BODY ZZ_PKG
AS
FUNCTION ZZ_TEST
RETURN SET_ITEM_MASTER PIPELINED
IS
-- Cursor선언(Record Type선언부와 일치해야 겠죠 ^^)
CURSOR cur_data IS
SELECT ITEM_ID
, ITEM_NAME
FROM IDB_ITEM_MASTER
;
BEGIN
-- Fetch Cursor
FOR ret_data IN cur_data LOOP
-- 해당row를 pipe 시킨다.
PIPE ROW(ret_data);
END LOOP;
RETURN;
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20001, 'Error..........');
END ZZ_TEST ;
END ZZ_PKG;
/
이제 패키지가 생성 되었으므로 패키지 안의 함수를 실행 시켜보자.
여기서 중요한 것은 Table Fuction을 사용해야 한다는것.
SELECT *
FROM TABLE(ZZ_PKG.ZZ_TEST())
이렇게 하면 결과가 다음과 같이 나타납니다.
ITEM_ID ITEM_NAME
36330 G1600.LKADB
36331 G1600.MOTDB
36332 G1600.MOTDS
36333 G1600.NGRDB
36334 G1600.NGRDS
36335 G1610.ESPBL