By using db<>fiddle, you agree to license everything you submit by Creative Commons CC0.
CREATE OR REPLACE FUNCTION RESET_SEQUENCE(pinSequence IN VARCHAR2,
pinStart_value IN NUMBER DEFAULT 1,
pinIncrement IN NUMBER DEFAULT 1)
RETURN NUMBER
AS
nVal NUMBER;
BEGIN
-- Get the next value from the sequence
EXECUTE IMMEDIATE 'SELECT ' || pinSequence || '.NEXTVAL ' ||
' FROM DUAL'
INTO nVal;
-- Change the sequence so it decrements or increments to the desired
-- start value the next time NEXTVAL is invoked.
EXECUTE IMMEDIATE 'ALTER SEQUENCE ' || pinSequence ||
' INCREMENT BY ' || (nVal - (pinStart_value - pinIncrement)) * -1 ||
' MINVALUE 0';
-- Decrement/increment the sequence to the desired start value
EXECUTE IMMEDIATE 'SELECT ' || pinSequence || '.NEXTVAL ' ||
' FROM DUAL'
INTO nVal;
-- Reset the sequence so it uses the desired "increment-by"
EXECUTE IMMEDIATE 'ALTER SEQUENCE ' || pinSequence ||
' INCREMENT BY ' || pinIncrement ||
' MINVALUE 0';
RETURN 1;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('RESET_SEQUENCE : ' || SQLCODE || ' ' || SQLERRM);
CREATE SEQUENCE MY_SEQUENCE
INCREMENT BY 1
NOMAXVALUE
MINVALUE 1
NOCYCLE
NOCACHE;
DECLARE
strSequence_name VARCHAR2(32767);
nVal NUMBER;
nReset NUMBER;
BEGIN
strSequence_name := 'MY_SEQUENCE';
EXECUTE IMMEDIATE 'SELECT ' || strSequence_name || '.NEXTVAL FROM DUAL'
INTO nVal;
DBMS_OUTPUT.PUT_LINE('nVal = ' || nVal);
EXECUTE IMMEDIATE 'SELECT ' || strSequence_name || '.NEXTVAL FROM DUAL'
INTO nVal;
DBMS_OUTPUT.PUT_LINE('nVal = ' || nVal);
EXECUTE IMMEDIATE 'SELECT ' || strSequence_name || '.NEXTVAL FROM DUAL'
INTO nVal;
DBMS_OUTPUT.PUT_LINE('nVal = ' || nVal);
EXECUTE IMMEDIATE 'SELECT ' || strSequence_name || '.NEXTVAL FROM DUAL'
INTO nVal;
DBMS_OUTPUT.PUT_LINE('nVal = ' || nVal);
nReset := RESET_SEQUENCE(strSequence_name, 10, 2);
DBMS_OUTPUT.PUT_LINE('nReset = ' || nReset);
EXECUTE IMMEDIATE 'SELECT ' || strSequence_name || '.NEXTVAL FROM DUAL'
INTO nVal;
DBMS_OUTPUT.PUT_LINE('nVal = ' || nVal);
EXECUTE IMMEDIATE 'SELECT ' || strSequence_name || '.NEXTVAL FROM DUAL'
INTO nVal;
DBMS_OUTPUT.PUT_LINE('nVal = ' || nVal);
EXECUTE IMMEDIATE 'SELECT ' || strSequence_name || '.NEXTVAL FROM DUAL'
INTO nVal;
1 rows affected
dbms_output:
nVal = 1
nVal = 2
nVal = 3
nVal = 4
nReset = 1
nVal = 10
nVal = 12
nVal = 14
nVal = 16
nReset = 1
nVal = 1
nVal = 2
nVal = 3
nVal = 4
nReset = 1
nVal = 1000
nVal = 1010
nVal = 1020
nVal = 1030