[출처] ORA-02287 에러에 대해 (시퀀스 번호는 이 위치에 사용할수 없습니다.)|작성자 데브원
ORA-02287 에러에 대해
작성자 : 오범석
E-MAIL : refreshman@chollian.net
작성일자 : 2004/07/01
다음과 같은 쿼리의 수행시 ORA-02287 에러가 발생할 수 있다.
--테이블 생성
CREATE TABLE TEST (AAA VARCHAR2(100), BBB NUMBER);
--시퀀스 생성
CREATE SEQUENCE TEST_SEQ INCREMENT BY 1
START WITH 1 MAXVALUE 9999999999999 MINVALUE 1
NOCYCLE NOORDER
CACHE 20;
이렇게 오브젝트들을 생성한 후...
테이블에 데이터를 INSERT 한다.
INSERT INTO TEST (AAA, BBB) VALUES('AAA',TEST_SEQ.NEXTVAL);
이렇게 데이터를 하나 입력한 후 INSERT INTO SELECT 문을 수행해 본다.
INSERT INTO TEST (AAA, BBB) SELECT AAA, TEST_SEQ.NEXTVAL FROM TEST;
이 입력문은 잘 수행될 것이다.
그러면 ORDER BY를 추가하여 쿼리를 수행해 보자.
INSERT INTO TEST (AAA, BBB) SELECT AAA, TEST_SEQ.NEXTVAL FROM TEST ORDER BY BBB;
이 입력문은 [ORA-02287: sequence number not allowed here] 라는 에러를 발생할 것이다.
SEQUENCE는 PL/SQL과 SQL 코딩시 몇몇 제한되게 사용된다.
SEQUENCE를 사용할 수 없는 경우는 다음과 같다.
SELECT 문장의 경우에서
1. WHERE 절 안에서
2. GROUP BY나 ORDER BY 절에서
3. DISTINCT 절에서
4. UNION 이나 INTERSECT 나 MINUS 와 함께 사용 할때
5. 서브 쿼리 안에서
다른 영역에서는 다음과 같다.
6. UPDATE나 DELETE 의 서브쿼리
7. VIEW나 SNAPSHOPT 에서
8. 테이블 정의시 CHECK 조건이나 DEFAULT 에서
위의 에제의 경우는 2번에 속하는 부분이다.
몇가지 해결 방안이 존재 하긴 하다.
1. WHARE 절이나 서브쿼리, ORDER BY 에서 사용하기 위해 먼저 변수로 시퀀스 번호를 생성해서
필요한 곳에 변수로 사용한다. 이 방법은 아주 원시적인 해결 방안이며 또한 위와 같은 예제를
해결 하기 위한 방안은 아니다. 위의 예제를 이 방법으로 해결하기 위해서는 프로시져를
작성하여 커서를 FETCH하여 FETCH 시 마다 SEQUENCE 번호를 생성하여 입력하는 방법으로 할 수도 있으며,
또한 INSERT INTO TEST (AAA, BBB)
SELECT AAA, TEST_SEQ.NEXTVAL
FROM (SELECT AAA FROM TEST ORDER BY BBB); 로 해도 된다.
2. 위와 같이 모든 로우에 대해 시쿼스 번호를 입력하기를 원하는 경우는 TRIGGER를 사용하여 입력하는
방법이 있다. BEFORE TRIGGER를 작성하여 입력 전에 SEQUENCE 번호를 생성하여 입력하는 것이다.
이 방법 또한 깔끔한 방법은 아니라고 생각되는 부분이다.
3. VIEW에서 SEQUNCE를 사용 하고자 한다면 SEQUENCE를 제외한 모든 COLUMN과 CONDITION으로 VIEW를
만들고 실제 뷰 쿼리 절에서 SEQUENCE를 사용하는 것이다. 이부분도 해결 방안이라기 보단
회피 방안인것 같은 생각이 든다.
프로젝트의 경험상으로 시퀀스는 보통 일련번호 생성하여 테이블에 입력하는 부분에서 많이 사용되는
부분이므로 위의 예와 같은 경우의 문제(INSERT INTO SELECT)에서 많이 봉착할 것이다. 이때는 해결방안 1번인
변수설정 방안이나 INNER VIEW 방안이 가장 좋을듯 하다.