기타

[오라클] 파이프 라인 함수는 지원되는 모음 반환 유형을 가져야 함 (Oracle 00630)

마샤와 곰 2022. 9. 15. 01:23

 

오라클에서 기존에 누군가(?) 만든 파이프라인 형식의 함수를 고칠 때 만난 오류였습니다.

파이프라인드 테이블 함수(Pipelined Table Functions)는 기존 함수가 1개의 데이터를 반환하는 데 반해 테이블 조회한 결과를 반환 하는 것 처럼 여러개의 값을 반환 할 때 사용 됩니다.

 

이를 위해서는 타입, 테이블 타입 2개가 필요 합니다.

CREATE OR REPLACE TYPE "DATE_RANGE" is object( my_date date );  --기본 타입

CREATE OR REPLACE TYPE "DATE_RANGE_MOTHER"  AS TABLE OF "DATE_RANGE";  --타입의 상위 테이블 타입

 

함수에서 반복문 또는 select 에 의해서 나온 여러개의 값을 기본타입에 넣어주고,

해당 타입을 지닌 테이블 타입을 반환하면 해당 함수는 파이프라인 함수로써의 기능을 발휘하게 됩니다.

아래와 같은 유형의 함수를 고칠 때 위 오류를 만났었습니다.


CREATE OR REPLACE FUNCTION  "FN_DATE_TIME_RANGE" ( start_date in date, end_date in date )
    RETURN DATE_RANGE_MOTHER PIPELINED  -- 여기 값은 타입을 포함하는 테이블 타입이어야 합니다.
IS
    result_date DATE_RANGE; -- 여기가 타입입니다.!!
BEGIN

    FOR arg IN (
        SELECT TO_CHAR(TO_DATE(start_date,'yyyy-mm-dd') + (LEVEL-1),'yyyy-mm-dd')  yyyymmdd
        FROM DUAL CONNECT BY LEVEL <= (TO_DATE(end_date,'yyyy-mm-dd') - TO_DATE(start_date,'yyyy-mm-dd') + 1 )
    )

    LOOP 
        FOR i IN 1..24
        LOOP
            result_date := DATE_RANGE(TO_DATE(arg.yyyymmdd || ' ' || (i -1), 'yyyy-mm-dd hh24:mi:ss')) ;         
            PIPE ROW(result_date); -- 타입값을 넣은 데이터를 PIPE ROW 명령어를 통해 넣어줍니다.
        END LOOP;
 
    END LOOP;

END;

 

result_date 값 자체가 date 형식의 자료형으로 되어 있었고, 반환(return) 하는 마지막 데이터도 date 형식의 자료형으로 되어 있었습니다.

함수를 주로 사용은 했어도 이렇게 테이블 형식으로 데이터가 반환하는, 파이프라인 함수는 만든적이 처음이라서..어떠한 부분이 문제였는지 확인하는데 시간을 꽤 썻던거 같습니다.

* 공부하는 동안에는 보았었겠지요..?

그때 만난 그 오류...

 

위 샘플 함수는 시작, 종료 기간을 받아서 00시부터 23시 까지의 값을 반환하는 함수 입니다.

아래는 실제 실행 하여본 모습 입니다.

잘 나옵니다..ㅋ

 

이상으로 "파이프 라인 함수는 지원되는 모음 반환 유형을 가져야 함" 오류가 나오는 경우 확인해야 되는 부분이였습니다.

틀린점 또는 궁금한점은 언제든 연락 주세요!👻

 

반응형