
에러메시지
ORA-02287: sequence number not allowed here
ORA-02287: 시퀀스 번호는 이 위치에 사용할 수 없습니다.
현상
INSERT INTO T_MNG (CODE, SEQ)
SELECT
A.CODE
, SEQ_T_MNG.NEXTVAL
FROM T_MNG_INFO
GROUP BY CODE
;
SELECT 결과를 INSERT 하는 쿼리 입다.
SELECT 할 때 테이블에서 가져온 값 1개와 시퀀스 번호를 자동 생성해서 함께 넣으려고 합니다.
그런데 ORA-02287 에러가 발생합니다.
원인
이 에러는 주로 INSERT INTO SELECT 절에서 자주 발생 된다고 합니다.
시퀀스 번호는 이 위치에 사용할 수 없다는 말대로,
저의 경우는 위처럼GROUP BY 절이 있는 쿼리의 SELECT 절에 시퀀스를 넣어서 에러가 났습니다.
그 외에도 시퀀스와 사용 불가한 쿼리는 아래를 참고해주세요.
[시퀀스 사용불가]
- GROUP BY 절 안에서
- ORDER BY 절 안에서
- DISTINCT
- UNION/MINUS/INTERSECT
- WHERE 절
- 서버쿼리
해결
INSERT INTO T_MNG (CODE, SEQ)
SELECT
A.CODE
, SEQ_T_MNG.NEXTVAL
FROM (
SELECT
CODE
FROM T_MNG_INFO
GROUP BY CODE
) A
;
테이블에서 가져오는 GROUP BY 절을 먼저 가공 후, 시퀀스를 부여해야 합니다.
에러가 난 자세한 이유는 쿼리 실행 순서 때문인데요.
SELECT 쿼리문을 실행하는 순서는 아래와 같습니다.
FROM > WHERE > GROUP BY > HAVING > SELECT > ORDER BY |
모든 조건들을 처리한 후에 남은 데이터에서 어떤 열을 출력할지 선택해서 SELECT 절을 실행합니다.
GROUP BY 절의 실행 순서에 경우 WHERE 조건에 간추린 데이터를 선택한 칼럼으로 GROUPING 작업을 한 결과를 만들어 냅니다.
그래서 실행 순서상 시퀀스는 아직 생성이 되지 않은 상태로 GROUPING 되어버립니다.
아직 존재하지 않는 데이터를 GROUP BY 하려는 시도는 논리적으로 모순이 되고 에러가 발생합니다.
그렇기 때문에 위처럼 시퀀스와 GROUP BY 절의 데이터를 가져오는 테이블을 분리하여 먼저 데이터를 가공한 후에 시퀀스를 부여하면 해결됩니다.
이와 같은 의미로 시퀀스는 DISTINCT절의 칼럼, WHERE 조건절, UNION/MINUS/INTERSECT 등과 함께 사용이 불가능 한 이유입니다. 서브쿼리 역시 사용할 수 없는데, 서브쿼리에 경우 SELECT 뿐 아니라 UPDATE, DELETE 구문에서도 사용할 수 없습니다.
오늘은 Oracle 구문 오류 ORA-02287 에러에 대해서 알아보았습니다.
<참고 사이트>
댓글