데이터베이스/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