코딩헤딩

오라클 데이터베이스 [ORA-06502, ORA-06503, ORA-04091] 오류 본문

데이터베이스/ORACLE

오라클 데이터베이스 [ORA-06502, ORA-06503, ORA-04091] 오류

멈머이 2025. 8. 1. 20:59
728x90

1. ORA-06502: PL/SQL: numeric or value error

  • 의미 : 숫자 또는 문자형 오류
  • 원인 : VARCHAR2 길이 초과, 숫자형 변환 실패, NULL을 숫자로 연산
DECLARE
  v_str VARCHAR2(5);
BEGIN
  v_str := '123456'; -- 길이 초과
END;
	-- 해결 방법
-- 1. 변수 크기 조정
-- 2. 데이터 유효성 체크

 
 
 
2. ORA-06503: PL/SQL: Function returned without value

  • 의미 : 함수에서 RETURN 없이 끝남
  • 원인 : IF~ELSE 중 일부 분기에서 RETURN이 없음
CREATE OR REPLACE FUNCTION test_func (p IN NUMBER)
RETURN VARCHAR2 IS
BEGIN
  IF p > 0 THEN
    RETURN 'OK';
  END IF;
  -- ELSE일 때 return 없음
END;

	-- 해결 방법
...
  ELSE
    RETURN 'FAIL';
END;

 
 
 
3. ORA-04091: table is mutating, trigger/function may not see it

  • 의미 : 트리거 내에서 변경 중인 테이블에 SELECT할 경우 발생
  • 원인 : BEFORE/AFTER 트리거 안에서 해당 테이블 SELECT
CREATE OR REPLACE TRIGGER trg_check
AFTER INSERT ON employees
FOR EACH ROW
BEGIN
  -- 트리거 안에서 employees 조회 → 오류
  SELECT COUNT(*) INTO v_cnt FROM employees WHERE deptno = :NEW.deptno;
END;


	-- 해결 방법
-- 1. 트리거 내에서는 :NEW / :OLD 값만 사용
-- 2. 필요하면 패키지 + 지연 처리 구조로 변경

 
 

4. ORA-06511: PL/SQL: cursor already open

  • 의미 : 커서가 이미 열려 있음
  • 원인 : 커서를 열고 OPEN을 반복 호출한 경우
OPEN my_cursor;
OPEN my_cursor; -- 두 번째 open에서 에러

--해결방법
IF NOT my_cursor%ISOPEN THEN OPEN my_cursor; END IF;

 

 

4. ORA-06550 / PLS-00103

  • 의미 : 구문 오류 (컴파일 에러)
  • 원인 : PL/SQL 문법 오류, 세미콜론 누락, 예약어 오용 등
BEGIN
  v_test := 'abc'
END;
-- 세미콜론 누락 → ORA-06550 + PLS-00103

--해결방법
-- 1. 에러 메시지 줄 번호 확인 후 수정
-- 2. SQL Developer에서 빨간줄 힌트 보기

 

 

  • 트리거 설계 시 조회 없이 변경값만 활용하는 구조로 설계
  • 함수 RETURN 경로는 반드시 명확히 설계
  • 커서 사용할 땐 %ISOPEN, CLOSE 처리 습관화

 

728x90