오라클에서 기존에 누군가(?) 만든 파이프라인 형식의 함수를 고칠 때 만난 오류였습니다.
파이프라인드 테이블 함수(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시 까지의 값을 반환하는 함수 입니다.
아래는 실제 실행 하여본 모습 입니다.
이상으로 "파이프 라인 함수는 지원되는 모음 반환 유형을 가져야 함" 오류가 나오는 경우 확인해야 되는 부분이였습니다.
틀린점 또는 궁금한점은 언제든 연락 주세요!👻
반응형
'기타' 카테고리의 다른 글
[커리어리] 한국판 스택오버 플로우 커리어리(careerly) (0) | 2023.04.02 |
---|---|
shp파일 gson 형식으로 변환하기(geojson, json) (0) | 2022.12.29 |
oracle 테이블스페이스 이(가) 존재하지 않습니다. oracle 공통 사용자 또는 롤 이름이 부적합합니다. (0) | 2022.09.01 |
이직 후기 (5) | 2022.07.20 |
신입 프로그래머, 프로그래머 직무 및 입사지원 유의사항 (0) | 2022.02.04 |
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)
댓글