코딩헤딩

오라클 데이터베이스 [ORA-00932, ORA-04098, ORA-01555] 오류 본문

데이터베이스/ORACLE

오라클 데이터베이스 [ORA-00932, ORA-04098, ORA-01555] 오류

멈머이 2025. 5. 29. 22:35
728x90

익숙한 실수지만 디버깅에 시간이 오래 걸리는 오류 3가지.

 

 

1. ORA-00932: inconsistent datatypes: expected X got Y

  • 의미 : 서로 다른 타입끼리 비교하거나 연산 시 발생
  • 원인 : VARCHAR2 컬럼과 NUMBER 값 비교, 날짜형끼리 = 또는 + 연산 시 타입 불일치
SELECT * FROM users WHERE user_id = '100'; 
  -- user_id가 NUMBER 타입일 때
  
-- 올바른 예
SELECT * FROM users WHERE user_id = TO_NUMBER('100');
-- 해결방법 타입 맞춰주기 (TO_NUMBER, TO_CHAR 등 사용)
-- 또는숫자 그대로 사용
SELECT * FROM users WHERE user_id = 100;

 

 

2.  ORA-04098: trigger is invalid and failed re-validation

  • 의미 : 트리거가 잘못 작성되어 실행할 수 없음
  • 원인 : 트리거 내부 SQL 오류, 참조하는 테이블, 컬럼 변경으로 구조 불일치
-- 트리거가 사용하는 컬럼이 삭제되거나 이름이 변경된 경우
-- 해결방법
	-- 1. 트리거 상태 확인
SELECT trigger_name, status FROM user_triggers WHERE table_name = '테이블명';

	-- 2. 오류 내용 확인
SHOW ERRORS TRIGGER 트리거명;
 
 	-- 3. 트리거 수정 후 컴파일
ALTER TRIGGER 트리거명 COMPILE;

 

 

3. ORA-01555: snapshot too old

  • 의미 : 오래된 커서를 참조하거나, 롤백 세그먼트가 제거되어 데이터를 복원할 수 없을 때 발생
  • 원인 : 긴 쿼리 수행 중 롤백 세그먼트가 덮어쓰기됨, 대량 데이터를 한 번에 처리하는 LOOP + SELECT
-- 커서 열어놓고 너무 많은 데이터를 처리하거나, FOR LOOP에서 오래 걸릴 때

-- 해결방법
  -- 쿼리를 작은 단위로 나눠 처리 (배치 처리 또는 BULK COLLECT), UNDO_RETENTION 시간 늘리기  
ALTER SYSTEM SET UNDO_RETENTION = 900; -- 초 단위 (예: 15분)
	-- 커서 대신 LIMIT + OFFSET 방식 사용 고려
728x90