공부한것들을 정리하는 블로그 입니다.
DB 날짜데이터 Insert시 반드시 정합성 체크를 할 것(DB Select 오류 ORA-01847 : 달의 날짜는 1에서 말일 사이여야 합니다) 본문
DB 날짜데이터 Insert시 반드시 정합성 체크를 할 것(DB Select 오류 ORA-01847 : 달의 날짜는 1에서 말일 사이여야 합니다)
호 두 2023. 4. 26. 17:24* 해당 글은 계속 수정 예정입니다.
최초 작성일 2021.11.25
마지막 수정일 2023.04
# 조회쿼리 수행결과 오류 발생
특정 테이블에 데이터를 Insert 하고 이후 Select 한다고 가정하자.
잘못된 날짜가 입력되었을 경우, 조회 조건으로 날짜를 입력시 조회쿼리 수행결과 오류가 발생 가능하다
(ORA-01847 : 달의 날짜는 1에서 말일 사이여야 합니다.)
이에 대한 해결법은,
DB에 날짜데이터를 Insert 해야 할 경우에는 정합성 체크가 선행될 수 있도록 하거나.
조회쿼리에서 조건문을 작성 할 때 주의해야 할 것이다.
조회쿼리에서 조건문을 작성시 날짜데이터를 이용하는 경우
ex) TO_CHAR(TO_DATE(DT_INPUT, 'YYYYMMDD') + 20211120 , 'YYYYMMDD') >= 0
ex) TO_CHAR(TO_DATE(DT_INPUT, 'YYYYMMDD') + 0 , 'YYYYMMDD') >= 20211120
# 이미 잘못 들어간 데이터는?
대상 건을 파악하여 DB작업을 통해 정상적인 날짜로 변경해주는 작업이 필요하다.
그렇지 않으면 해당 날짜데이터가 들어간 컬럼이 조회되는 모든 조회에 대해서 오류발생 소지가 있다.
ex) 다건의 이력이 저장되고, 그중 최신건만 불러오는 조회쿼리의 경우에도 문제가 발생 가능
잘못 들어간 데이터를 찾기 위해 오라클 function을 활용할 수도 있지만,
복합키나 인덱스를 이용해서 조회하는것이 아니라면. 시간이 오래 걸리는 것은 피할 수 없을 것 같다.
ex) 오라클 function 사용
create or replace function is_wrong_date(p_string VARCHAR2, p_format VARCHAR2)
return number
is
v_date DATE;
begin
v_date := to_date(p_string, p_format);
return 1;
exception
when others then
return 0;
end;
SELECT * FROM TABLE
WHERE 1=1
AND 0 = is_wrong_date(DT_INPUT, 'yyyymmdd') --0:날짜 오입력 / 1:정상
AND DT_INPUT != '99999999' --예외조건
;
# 참고
1. 본인 블로그 : (참고사례)
https://drsggg.tistory.com/735
'경력 실무경험 > 실무 주제' 카테고리의 다른 글
DB 시퀀스를 통한 일련번호 채번 시 주의(중복채번, 다중DB) (0) | 2023.04.27 |
---|---|
요청헤더 쿠키의 크기로 인한 이슈 발생 및 조치(노티서비스. 가맹점 400 오류응답. 쿠키와 세션) (0) | 2023.04.26 |
DB동기화 점검(지연발생)시 고려사항(개설기관 장애 응답) (0) | 2023.04.26 |
외부API 장애 발생과 대응 예상(카드사 TIMEOUT과 PG/VAN 대응) (0) | 2023.04.26 |
레거시 서버 장비노후 이슈 발생 및 조치 (0) | 2023.04.26 |
배치컨테이너 배포와 스케줄러 실행이 동시에 진행되는 것에 주의(InvalidGlobalDeployVersionException, InvalidGlobalDeployVersion, LinkageError) (0) | 2023.04.25 |
계좌이체 서비스의 은행점검시간으로 인한 딜레이 발생시 해결방안 (은행사 시스템취소) (0) | 2023.04.25 |
SimpleDateFormat 사용시 주의사항 (년도 포맷 주의사항) (0) | 2023.04.25 |