[Oracle] ORA-06512와 함께 발생하는 대표 에러 종합 가이드

반응형

ORA-06512 관련 사진

ORA-06512와 함께 발생하는 대표 에러 종합 가이드

ORA-06512와 함께 발생하는 대표 에러 종합 가이드

핵심 요약
ORA-06512PL/SQL 예외 스택의 위치 정보입니다. 실제 원인은 대개 함께 출력된 다른 ORA/PLS 코드입니다. → 스택의 최상단(또는 바로 위) 라인동반 코드를 먼저 읽으세요.

1. 스택 읽는 법 (가장 중요한 습관)

ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at "APP.PKG_BILLING", line 128
ORA-06512: at line 1
  • 근본 원인: ORA-06502 (형 변환/값 오류)
  • 발생 위치: APP.PKG_BILLING 128 라인

2. 대표 동반(근본 원인) 에러 Top 16

2.1 데이터/형식 불일치

ORA-06502 — numeric or value error (길이 초과, 형 변환, 정밀도, 서브스트링)

ORA-01722 — invalid number (문자 → 숫자 변환 실패)

ORA-01861 — literal does not match format string (날짜 포맷 불일치)

진단
-- 문제 컬럼/변수의 데이터 타입 확인
DESC 테이블명;
-- 날짜/숫자 변환 지점 찾기
SELECT ... TO_DATE(:v,'YYYY-MM-DD') ... FROM dual;
해결
  • 입력값 검증(길이/타입) & 정규화
  • TO_NUMBER/TO_DATE에 명시적 포맷 사용
  • 변수/컬럼 길이 확장, 예외 처리 추가

2.2 존재/권한 문제

ORA-00942 — table or view does not exist

ORA-00904 — invalid identifier (컬럼/별칭/오타)

ORA-01031 — insufficient privileges

PLS-00201 — identifier must be declared

PLS-00302 — component must be declared

ORA-06550 — PL/SQL compilation unit 오류 (컴파일 에러)

진단
-- 오브젝트 존재/권한 확인
SELECT owner, object_name, object_type, status FROM dba_objects
 WHERE object_name = UPPER(:name);

-- 컴파일 에러 상세
SHOW ERRORS PROCEDURE 스키마.프로시저명;
해결
  • 스키마 접두사 명시(schema.table) 및 동의어 점검
  • 필요 권한/롤 부여 (GRANT SELECT ON schema.table TO user;)
  • 정확한 컬럼/별칭 이름 사용, 재컴파일

2.3 데이터 제약 & 조회 로직

ORA-00001 — unique constraint violated (PK/Unique 중복)

ORA-01400 — cannot insert NULL into ("COL")

ORA-01403 — no data found (SELECT INTO가 행을 못 찾음)

ORA-01422 — exact fetch returns more than requested number of rows

진단
-- 중복/NULL/조회 결과 수 확인
SELECT ... FROM ... WHERE key = :v;
-- 제약 확인
SELECT constraint_name, constraint_type FROM user_constraints WHERE table_name='테이블';
해결
  • 키 생성 로직/시퀀스 재검토, 중복 체크
  • NOT NULL 컬럼에 기본값/검증 로직 추가
  • SELECT INTOCOUNT 선확인 또는 커서 사용

2.4 트리거/패키지 상태 & 뮤테이팅

ORA-04088 — error during execution of trigger

ORA-04098 — trigger is invalid and failed re-validation

ORA-04061 — existing state of package has been invalidated

ORA-04068 — existing state of packages has been discarded

ORA-04091 — table is mutating, trigger/function may not see it

진단
-- 트리거/패키지 상태
SELECT object_name, status FROM user_objects WHERE object_type IN ('TRIGGER','PACKAGE','PACKAGE BODY')
  AND object_name IN ('TRG_X','PKG_Y');

-- 최근 컴파일 에러
SELECT name, type, line, position, text FROM user_errors ORDER BY time DESC;
해결
  • 무효화(INVALID) 오브젝트 재컴파일
  • 뮤테이팅 방지: compound trigger / statement-level 로직 / 패키지 전역변수 큐 사용
  • 패키지 상태 에러는 세션 재시작 또는 ALTER PACKAGE COMPILE

2.5 사용자 정의 예외

ORA-20000 ~ ORA-20999RAISE_APPLICATION_ERROR로 발생시킨 비즈니스 예외

해결
  • 응용 로직 점검(업무 규칙 위반인지 확인)
  • 에러 코드/메시지 매핑 테이블 확인

3. 빠른 진단 플레이북 (현장 절차)

  1. 전체 스택을 로그에 저장
    -- 서버 출력 켜기
    SET SERVEROUTPUT ON
    BEGIN
      -- 실패 로직 호출
    EXCEPTION
      WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('에러: '||SQLERRM);
        DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
        RAISE;
    END;
    /
  2. 스택 최상단 원인 코드 식별 → 해당 범주(위 2장) 체크리스트 적용
  3. 소스 위치 열람
    SELECT line, text FROM dba_source
     WHERE name='PKG_USER' AND type='PACKAGE BODY' AND line BETWEEN 120 AND 150;
  4. 오브젝트 상태·권한 점검 → INVALID 재컴파일, 권한 GRANT
  5. 재현 테스트 데이터로 최소 케이스 작성 → 성공/실패 조건 분리

4. 예외 처리 템플릿 (현업 권장안)

CREATE OR REPLACE PACKAGE app_err AS
  e_dup EXCEPTION; PRAGMA EXCEPTION_INIT(e_dup, -1);           -- ORA-00001
  e_num EXCEPTION; PRAGMA EXCEPTION_INIT(e_num, -1722);        -- ORA-01722
  e_date EXCEPTION; PRAGMA EXCEPTION_INIT(e_date, -1861);      -- ORA-01861
END;
/

CREATE OR REPLACE PROCEDURE proc_example IS
BEGIN
  -- 업무 로직 ...
EXCEPTION
  WHEN app_err.e_dup THEN
    app_log('dup key', DBMS_UTILITY.FORMAT_ERROR_BACKTRACE); RAISE;
  WHEN app_err.e_num OR app_err.e_date THEN
    app_log('format issue', SQLERRM); RAISE;
  WHEN OTHERS THEN
    app_log('unknown', SQLERRM||' @ '||DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
    RAISE;
END;
/

5. 로깅 설계 팁

  • FORMAT_ERROR_BACKTRACE() + FORMAT_CALL_STACK() 동시 기록
  • 업무 키(주문번호 등), 바인드 값, 세션정보(SYS_CONTEXT) 저장
  • 오류 발생률 모니터링 대시보드(시간대/모듈별)

6. 예방 체크리스트

  • 입력 검증(길이·타입·널)과 명시적 캐스팅 사용
  • 스키마 접두/권한/동의어 일관성 유지, CI에 컴파일·유닛테스트 포함
  • 트리거 로직 최소화, 뮤테이팅 회피 패턴 적용
  • 패키지 상태 INVALID 모니터링 및 자동 재컴파일 파이프라인
  • 업무 예외는 RAISE_APPLICATION_ERROR로 코드/메시지 표준화

7. 기본 오류 대응 4단계 (일반오류형 공통)

  1. ① 외부 노출/권한·접속 경로 점검 (DB 링크/권한/리스너)
  2. ② 영향 범위 최소화(문제 프로시저·잡 일시 중단)
  3. ③ 접근 제어/리소스 제약 조정(권한·락·세션 제한)
  4. ④ 로그 수집·모니터링 지속 및 재발 방지 패치
결론: ORA-06512 자체는 원인이 아닙니다. “함께 나온 코드”를 기준으로 위의 범주(형식/존재·권한/제약/트리거·패키지/사용자 정의 예외)를 대입해 진단하면, 대부분 수 분 내 근본 원인에 도달할 수 있습니다.
반응형
LIST