더북(TheBook)

이제 사전 준비는 모두 마쳤으니 커서를 매개변수로 받아 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을 생성자의 매개변수로 전달했다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.