오라클 시퀀스 스스메 군

5744 단어 오라클plsql
제목대로 오라클의 시퀀스를 진행하기 위한 프로그램(PL/SQL)입니다.
htps : // 기주 b. 코 m / 노보 w34 / 오라 c

오라클 시퀀스를 진행하는 방법으로
(1) DROP SEQUENCE하여 원하는 값을 시작 값으로 설정 CREATE SEQUENCE
(2) INCREMENT BY를 지정하여 ALTER SEQUENCE한다 (한 번의 nextval에서 원하는 값까지 푸는 것)
라는 방법이 대표적입니다.
참고 : htp // 비누 0807. 하테나 bぉg. 코m/엔트리/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プロシージャが正常に完了しました。

좋은 웹페이지 즐겨찾기