
Oracle 데이터베이스에서 PL/SQL 블록을 작성하다 보면 간혹 ORA-01403: no data found 오류를 마주하게 됩니다. 이 오류는 단순히 “데이터가 없다”는 의미로 보이지만, 실무에서는 의도하지 않은 예외 종료를 유발하거나, 애플리케이션의 전체 흐름을 중단시키는 위험한 원인으로 작용할 수 있습니다. 본 글에서는 ORA-01403 오류의 정확한 의미와 발생 시점, 그리고 실무에서 어떻게 이를 효과적으로 제어하고 예방할 수 있는지를 상세히 소개합니다. 특히 PL/SQL 프로시저와 SELECT INTO 구문을 자주 사용하는 환경이라면 반드시 이해하고 있어야 할 핵심 내용입니다.
1. ORA-01403 오류란?
오라클의 ORA-01403: no data found 오류는 PL/SQL에서 SELECT INTO 구문을 실행했으나, 검색된 데이터가 전혀 없을 때 발생합니다. 일반적인 SQL에서는 단순히 “0 rows selected”로 끝나지만, PL/SQL에서는 이는 곧 예외 상황으로 간주되어 명시적 처리를 하지 않으면 오류가 발생하게 됩니다.
오류 메시지: ORA-01403: no data found
즉, SELECT INTO는 결과가 반드시 존재한다고 가정하는 구문이기 때문에, 하나의 행도 없으면 오라클은 이를 예외로 간주합니다.
2. ORA-01403 오류 주요 원인
| 오류 유형 | 발생 원인 | 예시 |
|---|---|---|
| SELECT INTO 결과 없음 | 조건에 맞는 행이 한 건도 존재하지 않음 | SELECT salary INTO v_sal FROM emp WHERE empno = 9999; |
| 데이터 삭제 또는 누락 | 테스트 환경과 실제 DB 간 데이터 불일치 | DELETE 후 SELECT INTO 실행 |
| 논리 조건 오류 | WHERE 절 조건이 잘못되었거나 존재하지 않음 | LIKE 조건 실수, 잘못된 JOIN |
| 동적 SQL 사용 시 누락 | EXECUTE IMMEDIATE 내 SELECT INTO 사용 시 | 동적 쿼리 결과가 없을 때 예외 발생 |
3. 실전 예제: 오류 재현과 해결
3-1. 오류 발생 예제
DECLARE
v_name VARCHAR2(50);
BEGIN
SELECT ename INTO v_name FROM emp WHERE empno = 9999;
DBMS_OUTPUT.PUT_LINE('Employee name: ' || v_name);
END;
위 쿼리는 empno = 9999에 해당하는 사원이 존재하지 않기 때문에 ORA-01403 오류가 발생합니다.
3-2. 해결 방법 ①: 예외 처리 추가
DECLARE
v_name VARCHAR2(50);
BEGIN
SELECT ename INTO v_name FROM emp WHERE empno = 9999;
DBMS_OUTPUT.PUT_LINE('Employee name: ' || v_name);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('해당 사원이 존재하지 않습니다.');
END;
이처럼 NO_DATA_FOUND 예외를 명시적으로 처리하면 오류를 방지하고 원하는 로직을 수행할 수 있습니다.
3-3. 해결 방법 ②: COUNT 또는 EXISTS로 선제 검사
DECLARE
v_name VARCHAR2(50);
BEGIN
IF EXISTS (SELECT 1 FROM emp WHERE empno = 9999) THEN
SELECT ename INTO v_name FROM emp WHERE empno = 9999;
DBMS_OUTPUT.PUT_LINE('Employee name: ' || v_name);
ELSE
DBMS_OUTPUT.PUT_LINE('해당 사원이 존재하지 않습니다.');
END IF;
END;
4. 실무에서 자주 접하는 시나리오
- 정기 배치 프로그램에서 특정 테이블 값 조회 후 처리 시 SELECT INTO 오류 발생
- NULL 값을 가지는 조건이 포함된 WHERE절로 인해 데이터 누락 발생
- 테스트 시에는 정상 실행되지만, 운영환경에서는 데이터 부족으로 오류 발생
따라서 SELECT INTO를 사용할 때는 반드시 예외 처리 또는 사전 검사 절차가 포함되어야 하며, 단일 행 반환이 확실하지 않은 경우에는 다른 접근 방식이 요구됩니다.
5. SELECT INTO 구문의 대안 및 비교
| 구문 유형 | 행 미존재 시 처리 방식 | 장점 | 단점 |
|---|---|---|---|
| SELECT INTO | ORA-01403 오류 발생 | 간결한 코드 | 예외 처리 필수 |
| SELECT ... INTO + COUNT | 사전 존재 여부 확인 | 안정적 로직 | 쿼리 2번 실행 |
| CURSOR 사용 | FETCH 여부로 판단 | 다중 행 처리 가능 | 복잡한 코드 구조 |
| COLLECTION + BULK COLLECT | 빈 컬렉션 리턴 | 대량 처리 성능 우수 | 오버헤드 가능성 |
6. 디버깅 및 예방법 체크리스트
- SELECT INTO에 사용된 WHERE 절이 정확한지 확인
- 대상 테이블의 데이터가 실제로 존재하는지 확인
- 테스트 환경과 운영 환경 간 데이터 차이 점검
- NULL 비교 시
= NULL이 아닌IS NULL을 사용했는지 확인 - NO_DATA_FOUND 예외에 대한 처리 로직을 항상 포함시킬 것
7. 마무리
ORA-01403 오류는 PL/SQL을 사용하는 오라클 개발자라면 반드시 마주하게 되는 고전적인 예외 상황입니다. 그러나 예외의 본질을 이해하고, SELECT INTO 구문이 가지는 특성을 명확히 인지하고 있다면 이 오류는 충분히 예방하거나 처리할 수 있습니다.
특히 프로시저, 트리거, 배치 프로그램 등에서 이 오류가 발생할 경우 전체 프로세스가 중단될 수 있으므로 반드시 NO_DATA_FOUND에 대한 예외 처리 로직을 포함하는 것이 안전한 코딩 습관입니다.
출처
- Oracle Database PL/SQL Language Reference - 공식 문서
- Oracle Dev Forum - ORA-01403 관련 사례 토론
'Database > Oracle' 카테고리의 다른 글
| [ORACLE] ORA-01747 : 부적절한 열 이름 오류 해결 가이드 (0) | 2025.07.27 |
|---|---|
| [ORACLE] ORA-01722 : invalid number 오류 완전 정복 (0) | 2025.07.27 |
| [ORACLE] ORA-01017 오류 해결 : 로그인 인증 실패의 핵심 원인과 실전 대응 방법 (0) | 2025.07.27 |
| [ORACLE] ORA-01000 : 최대 커서 수 초과 오류 해결 및 예방 가이드 (0) | 2025.07.27 |
| [ORACLE] ORA-00933 오류 해결 : SQL 명령어가 정확하지 않을 때 발생하는 핵심 원인과 대처 방법 (0) | 2025.07.27 |