タイトルの通り、Oracleのシーケンスをすすめるためのプログラム(PL/SQL)です。
https://github.com/noobow34/OracleSequenceIncreaser
Oracleのシーケンスを進める方法としては
(1)DROP SEQUENCEして、希望する値をスタート値とするCREATE SEQUENCEする
(2)INCREMENT BYを指定してALTER SEQUENCEする(一度のnextvalで希望する値まですすめるようにする)
という方法が代表的です。
参考:http://kenken0807.hatenablog.com/entry/2015/08/27/155940
しかし以下のような問題が考えられます。
(1)
一瞬とはいえシーケンスが消失する
(2)
シーケンスは消えないが、自分が管理者ではないデータベースではない場合にALTERするのは気が引ける
他の人もnextvalしてしまうと予定以上に値が進む
またはそもそもALTERの権限がない
というわけで最も原始的な方法**「ひたすらnextvalする」**をPL/SQLで自動化しました。
DECLARE
seqName VARCHAR2(128) := 'TEST_SEQ'; --シーケンス名をセットします
targetSeq number := 20000; --シーケンス終了値をセットします
seqSql varchar2(1000);
tempSeq number;
BEGIN
DBMS_OUTPUT.PUT_LINE('***** Oracle シーケンスすすめるくん Ver 1.0 *****');
DBMS_OUTPUT.PUT_LINE('処理対象シーケンス名:' || seqName);
seqSql := 'SELECT ' || seqName || '.nextval from dual';
DBMS_OUTPUT.PUT_LINE('実行SQL:' || seqSql);
EXECUTE IMMEDIATE seqSQl INTO tempSeq;
DBMS_OUTPUT.PUT_LINE('シーケンス現在値:' || tempSeq);
DBMS_OUTPUT.PUT_LINE('シーケンス終了値:' || targetSeq);
WHILE(tempSeq < targetSeq) loop
EXECUTE IMMEDIATE seqSQl INTO tempSeq;
END LOOP;
DBMS_OUTPUT.PUT_LINE('シーケンスが' || tempSeq ||'になりました。終了します。');
END;
/
C:\Users\xxxx>sqlplus xxxx/xxxx@xxxx
SQL*Plus: Release 19.0.0.0.0 - Production on 水 3月 25 23:27:58 2020
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
最終正常ログイン時間: 水 3月 25 2020 23:11:27 +09:00
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.4.0.0.0
に接続されました。
SQL> set serveroutput on
SQL> DECLARE
2 seqName VARCHAR2(128) := 'TEST_SEQ'; --シーケンス名をセットします
3 targetSeq number := 30000; --シーケンス終了値をセットします
4 seqSql varchar2(1000);
5 tempSeq number;
6 BEGIN
7 DBMS_OUTPUT.PUT_LINE('***** Oracle シーケンスすすめるくん Ver 1.0 *****');
8 DBMS_OUTPUT.PUT_LINE('処理対象シーケンス名:' || seqName);
9 seqSql := 'SELECT ' || seqName || '.nextval from dual';
10 DBMS_OUTPUT.PUT_LINE('実行SQL:' || seqSql);
11 EXECUTE IMMEDIATE seqSQl INTO tempSeq;
12 DBMS_OUTPUT.PUT_LINE('シーケンス現在値:' || tempSeq);
13 DBMS_OUTPUT.PUT_LINE('シーケンス終了値:' || targetSeq);
14
15 WHILE(tempSeq < targetSeq) loop
16 EXECUTE IMMEDIATE seqSQl INTO tempSeq;
17 END LOOP;
18
19 DBMS_OUTPUT.PUT_LINE('シーケンスが' || tempSeq ||'になりました。終了します。');
20 END;
21 /
***** Oracle シーケンスすすめるくん Ver 1.0 *****
処理対象シーケンス名:TEST_SEQ
実行SQL:SELECT TEST_SEQ.nextval from dual
シーケンス現在値:20001
シーケンス終了値:30000
シーケンスが30000になりました。終了します。
PL/SQLプロシージャが正常に完了しました。