헝D의 일기장

시스템 운영 중 원래 이상이 없던 select문에서 갑자기 '수치가 부적합합니다' 오류가 발생하면서 조회가 되지 않는 현상이 발생했다. 해당 쿼리는 테스트 DB에서 발생한 오류였으며 같은 쿼리를 운영DB에서 돌렸을때는 문제가 되지 않았다. 같은 쿼리인데 왜 테스트 DB에서만 문제가 있는지 생각해보니, 보통 경험적으로 이런 식의 오류가 있을때는 쿼리보다는 데이터에 문제가 있는 경우가 많았다.

 

이상이 있는 쿼리는 데이터 타입이 char인 컬럼 때문이었는데, 보통 char형의 데이터를 조회하려면 use_flag='0001' 이런식으로 따옴표를 붙여서 조회해야 하나 해당 쿼리에서는 use_flag=1 이라고 숫자로 조회하고 있었다. 

운영 DB에서 문제가 되지 않았던 이유는 운영 DB의 use_flag 컬럼에는 '0000', '0001' 이렇게 두가지 경우의 데이터만 있었는데, 오라클에서는 묵시적 형변환이라는 것이 있어서 숫자가 문자열보다 우선순위에 있어 자동으로 해당 컬럼의 값을 숫자로 형변환해 계산했기 때문이다. 

 

테스트 DB에서는 역시나 use_flag 컬럼에 이상이 있는 데이터가 있었다. 테스트 시에 이상이 있는 값이 들어가서 '0000', '0001', 'null' 이렇게 세가지의 값이 존재했다. 문자열 'null'이라는 값은 숫자로 형변환 할 수 없기 때문에 형 변환시 발생하는 오류인 수치가 부적합합니다 오류가 발생했던 것이다.

 

사실 애초에 select를 할때 use_flag='0001' 이라고 조건값을 줬다면 문제가 없었을 것이다. 데이터에 이상이 없는 경우라면 형변환되어 원하는 결과를 얻을 수 있겠지만 혹시나 데이터 중 숫자로 형변환 할 수 없는 데이터가 있다면 해당 쿼리는 오류가 발생할 수 밖에 없다. 조회시에는 정확한 조건값으로 조회 조건을 주도록 하자.

profile

헝D의 일기장

@헝D

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!