데이터베이스/ORACLE
오라클 데이터베이스 [ORA-00932, ORA-04098, ORA-01555] 오류
멈머이
2025. 5. 29. 22:35
728x90
익숙한 실수지만 디버깅에 시간이 오래 걸리는 오류
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