LoginSignup
1
1

More than 3 years have passed since last update.

Oracle シーケンスすすめるくん(ひたすらnextvalしてシーケンスを進める方法のPL/SQL化)

Last updated at Posted at 2020-03-25

タイトルの通り、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; 
/

実行例
image.png

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プロシージャが正常に完了しました。
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1