개발자 jin K

[Oracle] ORA-01427 단일 행 하위 질의에 2개 이상의 행이 리턴되었습니다. 본문

기타

[Oracle] ORA-01427 단일 행 하위 질의에 2개 이상의 행이 리턴되었습니다.

jin K 2021. 6. 9. 22:12

 

 

지나가는 에러지만 병원 내부에서 오라클 에러가 났다.

 

오류 코드는 ORA-01427. 어떤 문제 였는지 한번 회고해 보았다.



Caused by: java.sql.SQLException: ORA-01427: 단일 행 하위 질의에 2개 이상의 행이 리턴되었습니다.

java.sql.SQLException: ORA-01427: 단일 행 하위 질의에 2개 이상의 행이 리턴되었습니다.

WARN 14407 --- \[o-8082-exec-144\] .m.m.a.ExceptionHandlerExceptionResolver : Resolved   [java.util.concurrent.CompletionException: java.sql.SQLException: ORA-01427: 단일 행 하위 질의에 2개 이상의 행이 리턴되었습니다.

]

 

상세 에러 로그는 혹시 모를 대외비이니 올리지 않고 문제의 에러 로그를 찾아보자면 이러하다.

 

문제 상황은 결과가 하나가 나와야 하는 질의에 2개가 나온다는 것이다.

주로 서브쿼리에서 1건을 초과한 레코드라 나올 때 발생하는 에러다.

서브쿼리의 레코드가 1건이 아닌 총 N건이 나올 때 exception이 터지는 것이다.

 

인터넷에 나온 쿼리 수정 방법은 두 가지 이다.

 

-CODE= 에서 CODE IN 으로 변경

  • 서브쿼리에서 레코드가 단 건이 나오도록 조건절 추가 및 수정

즉 서브쿼리에서 단건이 나오도록 조건을 변경하거나, 서브 쿼리 자체가 여러 건 나오는 것을 인정하도록 만드는 방법이다.

이번 상황의 경우 우리 회사 쪽 소스가 아닌 병원 내부 소스의 문제라고 보여지는데, 한 사람의 환자가 하루에 여러 건의 병원 예약을 (진료과를 달리하여) 할 수 있다는 케이스를 빼놓고 내부에서 프로시저를 짰던 것 같다.

현재는 재현되지 않는 오류이고 해결!

 

 


  • 배운 점
  • 오라클 오류 코드 ORA-01427
  • 프로시저 오류
  • 우리 쪽 소스 프론트단 promise 분석

에러를 분석하는 것은 늘 재밌고 배우는 점이 있다.