본문 바로가기
Database/Oracle

[ORACLE] ORA-01403 오류 : 데이터 없음(No Data Found) 발생 원인과 실전 해결 방법

by Papa Martino V 2025. 7. 27.
728x90

ORA-01403 오류 : 데이터 없음(No Data Found) 발생 원인과 실전 해결 방법
[ORACLE] ORA-01403

 

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. 디버깅 및 예방법 체크리스트

  1. SELECT INTO에 사용된 WHERE 절이 정확한지 확인
  2. 대상 테이블의 데이터가 실제로 존재하는지 확인
  3. 테스트 환경과 운영 환경 간 데이터 차이 점검
  4. NULL 비교 시 = NULL이 아닌 IS NULL을 사용했는지 확인
  5. NO_DATA_FOUND 예외에 대한 처리 로직을 항상 포함시킬 것

7. 마무리

ORA-01403 오류는 PL/SQL을 사용하는 오라클 개발자라면 반드시 마주하게 되는 고전적인 예외 상황입니다. 그러나 예외의 본질을 이해하고, SELECT INTO 구문이 가지는 특성을 명확히 인지하고 있다면 이 오류는 충분히 예방하거나 처리할 수 있습니다.

특히 프로시저, 트리거, 배치 프로그램 등에서 이 오류가 발생할 경우 전체 프로세스가 중단될 수 있으므로 반드시 NO_DATA_FOUND에 대한 예외 처리 로직을 포함하는 것이 안전한 코딩 습관입니다.

출처

  • Oracle Database PL/SQL Language Reference - 공식 문서
  • Oracle Dev Forum - ORA-01403 관련 사례 토론
728x90