728x90
1. ORA-01427 오류 이해하기
Spring Framework 기반 웹 프로젝트 작업 중, 오라클 오류가 발생!
정상적으로 작동하는 부분도 있고, 오류가 뜨는 부분도 있어서 확인을 해봤다.
먼저, ORA-01427 오류는 단일 레코드 값을 반환해야하는 서브쿼리에서 다중 레코드가 반환될 때 발생하는 오류이다.
즉, 서브쿼리 결과값이 두 개 이상일 때 발생한다.
그래서 결과값이 하나일때는 정상적으로 작동했지만 예외 발생 시 해당 오류가 뜨게 된다..!
오류내용 : Request processing failed; nested exception is org.springframework.jdbc.BadSqlGrammarException
근본원인 : java.sql.SQLException: ORA-01427: single-row subquery returns more than one row
※ SELECT절에서 사용하는 스칼라 서브쿼리 (scala subquery)의 경우 단일 레코드 행을 반환한다.
2. 오류 해결하기 - 스칼라 서브쿼리 일 때
- 기존의 SQL문을 확인해서, 해당 파라미터에서 뜨는 결과 레코드를 확인한다.
- 스칼라 서브쿼리에서 값이 대표 값 개념으로 한 개의 레코드만 나오도록 수정한다. rownum=1을 추가했다.
- 오류 해결!
3. 오류 해결하기 - 스칼라 서브쿼리가 아닐 때
- 기존의 SQL문을 확인해서, 해당 파라미터에서 뜨는 결과 레코드를 확인한다.
- 서브쿼리에서 = 으로 적힌 부분을 IN 으로 수정한다.
- = 연산자를 사용할 경우 결과값 하나만을 반환함
- IN을 사용하면 다중 레코드 반환을 받을 수 있다
- 오류 해결!
내 경우에는 입사지원제한자를 select 하면서, 이력서 제목을 같이 출력했는데
이 경우에 지원자가 여러 이력서를 작성한 경우 이력서 제목 레코드가 다중 출력되어 해당 오류가 발생했다.
프로젝트를 진행하다가 해당 이력서 제목을 출력해주는 부분이 불필요해져서 select 부분을 지워서 해결했으나
제목을 출력하고 싶다면 rownum 을 활용해서 대표값 하나만 출력되도록 쿼리문을 수정하면된다.
728x90