개발/오라클
오라클 시퀀스 초기화 시퀀스값 1로 변경 sequense init
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 로 값을 얻어옴. |
해당 기능을 그대로돌리면 모든 시퀀스가 초기화될수있으니 처음SELECT절에서 필터링 하시기바랍니다!
보통 시퀀스 초기화기능은 MAX+1로 채번하는룰이 안전하지못한상황에서
꼭 반드시 지켜야하는 포멧이 있다
예)PK값이 날짜를 포함하고 3자리여야한다등등. 20200529-001
이럴떄 001부분을 시퀀스로 해주면 당연히 멀티스레드에 안전하면서도 포멧을 유지할수있다.
그러나 1000이넘어가면 더이상 채번이 곤란하기떄문에
오라클 JOB등을 통해서 00시에 시퀀스초기화를 걸어놓으면 멀티스레드에 안전하면서도 포멧을 잘유지할수가있음.
'개발 > 오라클' 카테고리의 다른 글
오라클 프로시저 synchronized (LOCK) 락 설정 (0) | 2020.06.17 |
---|---|
오라클 CONNECT BY 갖고놀기 (FROM TO 사이 날짜전부 가져오기) #1 (0) | 2020.06.11 |
오라클 DB LOCK 디비락 조회 및 KILL SESSION 스크립트 (0) | 2020.05.26 |
오라클 오브젝트 Object 내용조회 프로시저 내용검색 (0) | 2020.05.26 |
오라클 the password has expired 오류 (0) | 2015.09.02 |
댓글