개발자의 끄적끄적

[ORACLE]오라클_시퀀스(NEXTVAL , CURRVAL) 사용법 본문

개발/sql

[ORACLE]오라클_시퀀스(NEXTVAL , CURRVAL) 사용법

효벨 2020. 8. 10. 03:00
728x90
반응형

[ORACLE]오라클_시퀀스(NEXTVAL , CURRVAL) 사용법

 

NEXTVAL 와 CURRAVAL 은 당연히 시퀀스를 먼저 생성을 해야 사용이 가능합니다.

 

*시퀀스 생성, 수정, 삭제

(https://mine-it-record.tistory.com/61)

 

둘의 사용법은 굉장히 간단합니다.

 

앞서 시퀀스 생성 부분에서 'testSeq'를 생성했었는데 그것을 이용해 보도록 하겠습니다

 

해당 시퀀스의 값을 증가시키고 싶다면

testSeq.NEXTVAL

 

현재 시퀀스를 알고 싶다면

testSeq.CURRVAL

 

이런식으로 사용이 가능합니다.

 

다만 시퀀스를 사용하는것에는 주의할 점이 있는데요

 

* NEXTVAL 및 CURRVAL 을 사용할 수 있는 경우

 - 서브쿼리가 아닌 SELECT문

 - INSERT문의 SELECT절

 - INSERT문의 VALUE절

 - UPDATE문의 SET절

 

* NEXTVAL 및 CURRVAL 을 사용할 수 없는 경우

 - VIEW의 SELECT절

 - DISTINCT 키워드가 있는 SELECT문

 - GROUP BY, HAVING, ORDER BY절이 있는 SELECT문

 - SELECT, DELETE, UPDATE의 서브쿼리

 - CREATE TABLE, ALTER TABLE 명령의 DEFAULT값

 

 

기본사용법은 다음과 같습니다.

 

 

SELECT testSeq.NEXTVAL FROM DUAL; -- 해당 시퀀스의 다음값

 

SELECT testSeq.CURRVAL FROM DUAL; -- 해당 시퀀스의 현재값

 

INSERT INTO oracleStudy VALUES(testSeq.NEXTVAL, 'studyName' , 'class' , A); --INSERT에서의 시퀀스 다음값 

 

 

*여기서 주의할점은 SELECT 하는 조회에서도 NEXTVAL를 썼을경우 시퀀스자체의 값을 증가된후에 그대로 증가된값으로 남아있습니다.

(테이블과 시퀀스는 별도로 움직이기 때문입니다.)

 

[시퀀스(Sequence) 초기화 방법]

 

시퀀스값을 초기화 하는 방법을 알아보자

 

우선 흔히 인터넷에 깔린 방법은

 

 

--시퀀스의 현재값 확인

SELECT LAST_NUMBER FROM USER_SEQUENCES  WHERE SEQUENCE_NAME = 'TESTSEQ';

 

--시퀀스의 증가값 변동 (현재값이 3일경우 -3으로 처리)

ALTER SEQUENCE testSeq INCREMENT BY -3;

 

SELECT testSeq.NEXTVAL FROM DUAL; --다음값으로 증가값만큼의 처리

 

SELECT testSeq.CURRVAL FROM DUAL; --현재값을 확인해본다

 

--시퀀스의 증가값 변동 (원상복구)

ALTER SEQUENCE testSeq INCREMENT BY 1;

Colored by Color Scripter

 

 

이런식으로 되어있는데 직접 또 해본결과 LAST_NUMBER을 조회할때 간혹 이상하게 나오는 경우가있다. 

 

그 이유는 CACHE를 설정해주었거나 아무설정안했을때 기본 DEFAULT 값 20이 들어갔을경우다!!!

 

(20만큼 미리 오라클 내부에서 NEXTVAL이 된 상태로 존재하기때문에 LAST_NUMBER를 했을경우 그 값이 나옵니다.)

 

그래서 저 위의 방법은 NOCACHE를 설정해주었거나 다른 DB에서 시퀀스를 초기화할때 사용하면 좋을거같다.

 

그냥 간단하게 현재 값을 알기만 하면 되기때문에

 

SELECT testSeq.CURRVAL FROM DUAL;

 

이렇게 현재값을 체크해준다음

 

만약 현재값이 3이다! 그러면 INCREMENT BY 를 -2 만큼 해준다음 NEXTVAL 처리하고 다시 원상복구 시켜주면 초기화가 완료된다.

(현재값 확인하는 방법만 다르고 나머지는 위와 동일합니다. 아 INCREMENT 를 현재값보다 하나 작게하는게 다르겠군요)

 

 

출처 : https://mine-it-record.tistory.com/62

반응형
Comments