(※) 増分値が尋常ではない場合には 自律型トランザクション と シーケンスの現在値を再設定する を
応用して ALTER SEQUENCE INCREMENT BY で増分値を一時的に増加させる手法などを用いるとよいだろう。
BULKCOLLECT_SEQ ファンクション
CREATE OR REPLACE FUNCTION RIVUS.BULKCOLLECT_SEQ(
P_SEQNAME IN VARCHAR2,
P_COUNT IN NATURALN
)
RETURN NUMBER
IS
PRAGMA AUTONOMOUS_TRANSACTION;
eLockFailure EXCEPTION;
TIMEOUT_SEC CONSTANT NUMBER := 3;
vSQL VARCHAR2(100);
vSeq NUMBER;
vDummy NUMBER;
vSeqName VARCHAR2(30);
vLock VARCHAR2(128);
vLockState NUMBER;
BEGIN
vSeqName := UPPER(P_SEQNAME);
-- USER LOCK SECTION
DBMS_LOCK.ALLOCATE_UNIQUE(vSeqName, vLock);
vLockState := DBMS_LOCK.REQUEST(vLock, DBMS_LOCK.X_MODE, TIMEOUT_SEC);
IF (vLockState <> 0) THEN
RAISE eLockFailure;
END IF;
-- LOCK SECTION END
vSQL := 'SELECT ' || vSeqName || '.NEXTVAL INTO :SEQ FROM DUAL';
EXECUTE IMMEDIATE vSQL INTO vSeq;
FOR i in 2..P_COUNT
LOOP
EXECUTE IMMEDIATE vSQL INTO vDummy;
END LOOP;
-- USER UNLOCK
vLockState := DBMS_LOCK.RELEASE(vLock);
IF (vLockState <> 0) THEN
RAISE eLockFailure;
END IF;
-- UNLOCK SECTION END
RETURN vSeq;
EXCEPTION
WHEN OTHERS THEN
RAISE TIMEOUT_ON_RESOURCE;
END;
/