본문 바로가기
개발/오라클

오라클 시퀀스 초기화 시퀀스값 1로 변경 sequense init

by #무한동력 2020. 5. 29.
 DECLARE    
    V_CURRVAL NUMBER;
    V_MINUSVAL NUMBER;
BEGIN
    DBMS_OUTPUT.PUT_LINE('STA');
    FOR I IN(
        SELECT OBJECT_NAME
        FROM DBA_OBJECTS
        WHERE OBJECT_TYPE = 'SEQUENCE'
        AND OWNER = '스키마명'
    )
    LOOP
        EXECUTE IMMEDIATE 'SELECT '|| I.OBJECT_NAME || '.NEXTVAL FROM DUAL' INTO V_CURRVAL;
        V_MINUSVAL := (V_CURRVAL * -1) + 1;
        EXECUTE IMMEDIATE 'ALTER SEQUENCE '|| I.OBJECT_NAME || ' INCREMENT BY '||V_MINUSVAL;
        EXECUTE IMMEDIATE 'SELECT '|| I.OBJECT_NAME || '.NEXTVAL FROM DUAL' INTO V_CURRVAL;
        EXECUTE IMMEDIATE 'ALTER SEQUENCE '|| I.OBJECT_NAME || ' INCREMENT BY 1';
    END LOOP;
END;

오라클이 따로 시퀀스를 초기화하는 기능은 존재하지않아서

이와같은 편법으로 만들어야한다.

방식을 설명하자면 아래와같다.

1. 초기화대상 시퀀스.NEXTVAL 로 값을 얻어옴.
2. 얻어온 NEXTVAL값을 음수로변경하여 V_MINUSVAL에 할당
3. V_MINUSVAL만큼 INCREMENT BY 로 설정
4. 다시 시퀀스.NEXTVAL 수행 
5. INCREMENT BY 를 다시1로 설정.

해당 기능을 그대로돌리면 모든 시퀀스가 초기화될수있으니 처음SELECT절에서  필터링 하시기바랍니다!

 

보통 시퀀스 초기화기능은 MAX+1로 채번하는룰이 안전하지못한상황에서

꼭 반드시 지켜야하는 포멧이 있다

예)PK값이 날짜를 포함하고 3자리여야한다등등. 20200529-001 

이럴떄 001부분을 시퀀스로 해주면 당연히 멀티스레드에 안전하면서도 포멧을 유지할수있다.

그러나 1000이넘어가면 더이상 채번이 곤란하기떄문에

오라클 JOB등을 통해서 00시에 시퀀스초기화를 걸어놓으면 멀티스레드에 안전하면서도 포멧을 잘유지할수가있음.

 

 

댓글