오라클 데이터베이스를 운영하거나 PL/SQL 프로시저 및 패키지를 개발할 때 가장 흔히 마주치는 논리적 예외 중 하나가 바로 ORA-01403: no data found 입니다. 문법적 오류가 없음에도 불구하고 런타임 시점에 데이터를 찾지 못해 프로그램 흐름을 중단시키는 이 에러의 내부 메커니즘과 실무적인 대응 방안을 살펴보겠습니다.
1. 개요 (Overview)
ORA-01403 에러는 PL/SQL 블록 내의 단일 행 조회(Select Into) 문장이 데이터베이스로부터 단 하나의 행도 가져오지 못했을 때 발생합니다.
일반적인 SQL(SELECT 쿼리) 툴에서는 조회 결과가 없으면 단순히 '0건 조회'로 처리되지만, PL/SQL 내부에서 변수에 값을 담는 SELECT INTO 구문이나 명시적 커서가 아닌 방식에서 결과가 없을 경우 오라클은 이를 예외(Exception) 상황으로 간주하고 이 에러를 발생시킵니다.
2. 내부 메커니즘: PL/SQL의 단일 행 조회(Select Into) 처리
PL/SQL은 SQL의 집합적 처리 결과와 절차적 언어의 변수 할당을 결합한 구조를 가집니다.
- SELECT INTO의 무결성 전제: PL/SQL에서 SELECT col1 INTO v_var FROM tab WHERE ... 구문을 실행하면, 오라클은 결과 건수가 정확히 1건 반환될 것을 기대합니다.
- NO_DATA_FOUND 예외 트리거: 조회 결과가 0건이면 변수에 대입할 값이 존재하지 않으므로, 오라클은 내부적으로 NO_DATA_FOUND 예외(사전 정의된 예외, 영문 에러 코드 ORA-01403)를 발생시킵니다.
- 예외 처리 부재 시 중단: 개발자가 이 예외를 잡기 위한 EXCEPTION 블록을 작성해 두지 않았다면, 해당 PL/SQL 프로그램은 즉시 비정상 종료됩니다.
3. 주요 원인 분석
실무 환경에서 ORA-01403 에러가 발생하는 대표적인 시나리오는 다음과 같습니다.
- 조건에 부합하는 데이터 부재: 검색 조건(WHERE 절)에 맞는 데이터가 실제 테이블에 존재하지 않는데 단일 행 조회를 수행한 경우입니다.
- 잘못된 파라미터 값 전달: 애플리케이션이나 상위 프로시저에서 넘어온 키 값(예: EMP_ID)이 잘못되었거나 존재하지 않는 값을 참조할 때 발생합니다.
- 커서(Cursor) 루프 처리 미흡: 여러 건이 조회될 수 있는 쿼리에 명시적 커서를 사용하지 않고 단순 SELECT INTO를 사용했거나, 반대로 건수가 없는 데이터를 다룰 때 발생합니다.
4. 트러블슈팅 및 해결 방안
ORA-01403 에러를 방지하고 안정적인 PL/SQL 코드를 작성하기 위한 베스트 프랙티스입니다.
단계 1: 예외 핸들러(EXCEPTION 블록) 추가
PL/SQL 내부에 NO_DATA_FOUND 예외를 명시적으로 처리하여 프로그램이 중단되는 것을 막고 대체 로직을 수행합니다.
DECLARE
v_emp_name employees.emp_name%TYPE;
BEGIN
-- 단일 행 조회 시도
SELECT emp_name
INTO v_emp_name
FROM employees
WHERE emp_id = 99999; -- 존재하지 않는 사원 번호 가정
EXCEPTION
WHEN NO_DATA_FOUND THEN
-- 데이터가 없을 때의 안전한 대체 처리
v_emp_name := 'Unknown';
DBMS_OUTPUT.PUT_LINE('조회된 데이터가 없습니다. 기본값으로 대체합니다.');
END;
/
단계 2: 집계 함수(Max, Count 등) 활용 검토
특정 값이 반드시 존재한다는 보장이 없다면, SELECT INTO 대신 MAX() 함수를 사용하거나 집계 쿼리를 사용하여 결과가 없어도 ORA-01403이 발생하지 않도록 유도할 수 있습니다. (MAX는 데이터가 없어도 에러 대신 NULL을 반환합니다.)
-- MAX 함수를 사용하면 데이터가 없을 때 에러 대신 NULL이 반환되어 안전함
SELECT MAX(emp_name)
INTO v_emp_name
FROM employees
WHERE emp_id = 99999;
5. 요약 및 해시태그
ORA-01403 (No Data Found)는 PL/SQL 환경에서 단일 행 조회 시 데이터 부재로 발생하는 대표적인 예외입니다.
철저한 예외 핸들링 구조 설계와 집계 함수 활용을 통해 견고한 데이터베이스 프로그램을 구현할 수 있습니다.
'Database > Oracle' 카테고리의 다른 글
| 오라클 ORA-01017 (Invalid Username/Password) 에러 분석과 보안 인증 트러블슈팅 가이드 (0) | 2026.10.07 |
|---|---|
| 오라클 ORA-01722 (Invalid Number) 에러 분석과 데이터 형 변환 가이드 (0) | 2026.10.07 |
| 오라클 ORA-00933 (SQL Command Not Properly Ended) 에러 분석과 개발자 실수 패턴 가이드 (0) | 2026.10.07 |
| 오라클 ORA-04031 (Shared Pool Memory Allocation) 에러 분석과 메모리 튜닝 가이드 (0) | 2026.10.07 |
| 오라클 ORA-00600 (Internal Error) 에러 분석과 내부 트러블슈팅 가이드 (0) | 2026.10.07 |
