이제 사전 준비는 모두 마쳤으니 커서를 매개변수로 받아 ch14_cmplx_nt 타입을 반환하는 테이블 함수를 만들어 보자.
입력
CREATE OR REPLACE FUNCTION fn_ch14_table2 ( p_cur ch14_empty_pkg.emp_refc_t )
RETURN ch14_cmplx_nt
IS
-- 입력 커서에 대한 변수 선언
v_cur p_cur%ROWTYPE;
-- 반환할 컬렉션 변수 선언(컬렉션 타입이므로 초기화를 한다)
vnt_return ch14_cmplx_nt := ch14_cmplx_nt();
BEGIN
-- 루프를 돌며 입력 매개변수 p_cur를 v_cur로 패치
LOOP
FETCH p_cur INTO v_cur;
EXIT WHEN p_cur%NOTFOUND;
-- 컬렉션 타입이므로 EXTEND 메소드를 사용해 한 로우씩 신규 삽입
vnt_return.EXTEND();
-- 컬렉션 요소인 OBJECT 타입에 대한 초기화
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;
END LOOP;
-- 컬렉션 반환
RETURN vnt_return;
END;
결과
FUNCTION FN_CH14_TABLE2이(가) 컴파일되었습니다.
성공적으로 컴파일되었다. 위 함수는 매개변수로 들어온 커서를 커서 변수에 패치하면서 커서 변수에 담긴 값을 미리 정의해 놓은 컬렉션 타입 변수에 담은 후 이 변수를 반환하고 있다. 좀 주의를 기울여야 할 부분은 컬렉션 변수의 초기화 부분이다. 단일 데이터 타입을 요소로 하는 컬렉션과는 달리, ch14_cmplx_nt 컬렉션 타입은 4개의 항목으로 구성된 ch14_obj_type1라는 OBJECT 타입을 요소로 삼는다. 따라서 ch14_cmplx_nt 컬렉션 타입 변수인 vnt_return에 값을 할당하기 전에 먼저 OBJECT 타입에 대한 생성자인 ch14_obj_type1( )로 초기화 해야 한다. ch14_obj_type1 타입은 4개의 항목으로 구성되어 있으므로 총 4개의 NULL을 생성자의 매개변수로 전달했다.