오라클 자주발생하는 에러 및 해결
오라클 자주 발생하는 에러모음이며
추가적인 오류 발생 및 해결방안/예측가능한 방법이
생길 시 주기적으로 정리하여 업데이트 예정입니다.
오류 순서 ( 오류코드를 ctrl + F 로 찾아서 원하는 내용 확인하시면 편합니다. )
ORA-00001: 무결성 제약 조건(USERS.EMP)에 위배됩니다.
ORA-00904: "EMPNOA": 부적합한 식별자
ORA-00942: 테이블 또는 뷰가 존재하지 않습니다
ORA-01400: NULL을 ("SCOTT"."EMP"."EMPNO") 안에 삽입할 수 없습니다.
ORA-01438: 이 열에 대해 지정된 전체 자릿수보다 큰 값이 허용됩니다
ORA-01555: 너무 이전 스냅샷:롤백 세그먼트 11수에 "_SYSSMU11_1602219420$" 이름으로 된 것이 너무 작습니다
ORA-14016: LOCAL 분할영역 인덱스로 강조된 테이블은 분할영역이 되어 있어야 합니다
ORA-12899: "SCOTT"."EMP"."ENAME" 열에 대한 값이 너무 큼(실제: 13, 최대값: 10)
ORA-30926: 원본 테이블의 고정 행 집합을 가져올 수 없습니다
오류코드 ( ORA-00001 )
EMPNO |
ENAME |
JOB |
MGR |
HIREDATE |
SAL |
COMM |
DEPTNO |
7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800 | 20 | |
7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600 | 300 | 30 |
7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250 | 500 | 30 |
원인
1. EMPNO 가 Primary Key 로 설정되어 있을 때 같은 값을 입력할 경우 key 중복오류가 발생합니다.
2. 다수의 건을 적재 시 Primary Key 값이 동일한 row 가 여러건이 아닌지 확인이 필요합니다.
오류코드 ( ORA-00904 )
ORA-00904: "EMPNOA": 부적합한 식별자
SQL 실행
SELECT EMPNOA FROM EMP ;
원인
1. 테이블에 없는 컬럼을 조회했을 경우 발생합니다.
2. 오탈자가 원인인 경우가 많으니 잘 살펴봅니다.
3. 정상적으로 사용중인 테이블에서 발생하는 경우 컬럼이 DROP 되었을 수 있으니 테이블을 다시 확인해봅니다.
해결
1. 오탈자 확인 후 수정합니다.
2. 컬럼이 DROP 된 경우 ADD , 또는 SELECT 문에서 같이 제외합니다.
오류코드 ( ORA-00942 )
( table or view does not exist )
원인
1. FROM 절에 테이블명이 잘못 입력된 경우
2. 테이블은 존재하지만 해당 스키마에 권한이 없는 경우
( GRANT 로 권한을 부여하여 해결합니다. ( GRANT 권한 부여 방법 ) )
해결
대부분의 오류는 이 두개에서 자주 발생하게 되니 오탈자가 없는지 먼저 확인해보시길 바랍니다.
오류코드 ( ORA-01400 )
ORA-01400: NULL을 ("SCOTT"."EMP"."EMPNO") 안에 삽입할 수 없습니다.
SQL 실행
INSERT INTO EMP (ENAME) VALUES ('James Cameron') ;
원인
Primary Key 가 존재하는 테이블인데 PK 에 null 이 입력되어 발생하는 오류입니다.
해결
테이블의 PK 가 EMPNO 로 구성되어 있으므로, 해당컬럼에 값을 입력하여 정상적인 ROW 로 생성합니다.
오류코드 ( ORA-01438 )
ORA-01438: 이 열에 대해 지정된 전체 자릿수보다 큰 값이 허용됩니다.
SQL 실행
INSERT INTO EMP (EMPNO) VALUES (12345) ;
원인
입력하려는 컬럼의 자릿수가 NUMBER(4,0) 인데 4 자리를 초과하여 입력하여 오류가 발생하였습니다.
해결
예상치 못한 값이 입력되었을 수 있으니 입력하려는 값의 확인이 필요합니다.
오류코드 ( ORA-01555 )
ORA-01555: 너무 이전 스냅샷:롤백 세그먼트 11수에 "_SYSSMU11_1602219420$" 이름으로 된 것이 너무 작습니다
SQL 실행
INSERT INTO EMP SELECT EMPNO FROM CUSTOMER
원인
대용량 테이블에서 발생할 가능성이 매우 높음.
위의 SQL 실행을 예로 들면
CUSTOMER 테이블을 조회 하여 EMP 테이블에 데이터를 INSERT 하는 SQL 입니다.
SQL 실행시간이 약 10분 걸리는데
그 사이 CUSTOMER 테이블의 데이터가 변경된 경우
오류가 발생할 수 있습니다.
해결
1. INSERT 도중 SELECT 하는 데이터에 변화를 일으키지 않도록 합니다.
2. SQL 튜닝을 통해 실행시간을 줄여 데이터를 입력하도록 합니다.
오류코드 ( ORA-14016 )
ORA-14016: LOCAL 분할영역 인덱스로 강조된 테이블은 분할영역이 되어 있어야 합니다.
( underlying table of a LOCAL partitioned idnex must be partitioned )
SQL 실행
CREATE UNIQUE INDEX PK_TB_USER_INFO ON TB_USER_INFO ( USER_NO ) TABLESPACE USERS LOCAL ;
원인
파티션 테이블이 아닌 일반 테이블에서 INDEX 생성 시 LOCAL 영역으로 지정하려고 하니 오류가 발생하였습니다.
해결
CREATE UNIQUE INDEX PK_TB_USER_INFO ON TB_USER_INFO ( USER_NO ) TABLESPACE USERS ;
오류코드 ( ORA-12899 )
ORA-12899: "SCOTT"."EMP"."ENAME" 열에 대한 값이 너무 큼(실제: 13, 최대값: 10)
SQL 실행
INSERT INTO EMP (EMPNO, ENAME ) VALUES (1111, 'James Cameron') ;
원인
오류메세지를 보면 알 수 있듯 ENAME 의 지정된 컬럼 길이는 VARCHAR2(10 BYTE) 로 설정되어 있으나,
실제입력한 컬럼의 값은 13 BYTE 로 입력되어 오류가 발생하였습니다.
해결
1. 컬럼사이즈를 증가시켜줍니다.
2. 입력되는 값을 줄여서 입력합니다.
오류코드 ( ORA-30926 )
ORA-30926: 원본 테이블의 고정 행 집합을 가져올 수 없습니다
unable to get a stable set of rows in the source tables
SQL 실행
MERGE INTO SCOTT.EMP T1 USING ( SELECT DEPTNO FROM SCOTT.DEPT WHERE DNAME LIKE '%SALES%' ) T2 ON (T1.DEPTNO = T2.DEPTNO) WHEN MATCHED THEN UPDATE SET T1.SAL = '3000'
원인
일단 말도 안되는 문장이지만 예를 들면 부서가 SALES 라는 명칭이 들어간 부서는 급여를 3000 으로 변경하는 쿼리입니다.
USING 안의 구분에서 실행한 결과가
DEPTNO | DNAME |
30 | SALES |
30 | SALES |
위처럼 출력되었다면 데이터가 2건이상 발생하였고
ON 절에서 JOIN 으로 사용하는 DEPTNO 가 2건이상이 발생한 경우 오류가 발생할 수 있습니다.
해결
1. USING 절에서 사용되는 문장이 KEY 당 1건만 조회되도록 SQL 을 작성합니다. ( EX : GROUP or DISTINCT 이용 )
2. ON 절에서 KEY 값으로 JOIN 이 잘 되었는지 확인합니다.
'IT > Oracle' 카테고리의 다른 글
plsql developer 편의기능집합 (6) | 2017.12.06 |
---|---|
오라클 최근 생성된 테이블, 뷰 확인 (0) | 2017.11.09 |
오라클 RANK , DENSE_RANK 이것만 알면 실무에서도 한사람 역할은 한다 (2) | 2017.09.05 |
오라클 KEEP , FIRST , LAST 예제로 확인하는 사용법 (3) | 2017.09.04 |
오라클 파티션 테이블 샘플(생성 수정 삭제) 및 주의사항 (4) | 2017.07.25 |