Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
![]() |
![]() |
Home -> Community -> Usenet -> c.d.o.server -> Reseting a sequence number to value less than current last_number
I have a bunch of sequnce numbers to reset. I would rather not drop
and recreate them to have to do grants and recompiles.
I am trying to get the below program that I wrote to work. Maybe someone can enlighten me on my flaw. The last number never changes.
Forgive the spaghetti code!
rem Date: 23-Apr-2003 rem Invoke: invoke from sqlplus sqlplus -s / @reset_seq prefixseq number
rem Oracle does not currently support and alter sequence parm for the
start with
parm.
rem If you have a bunch of grants and procedures that depends on this
sequence t
his keeps you from
rem redoing that after the drop and complete.
rem
set serveroutput on size 1000000
set verify on
define schema = '&1' define seq = '&2' define seqnbr = '&3' DECLARE s_sequences dba_sequences%rowtype; s_owner dba_sequences.sequence_owner%TYPE := '&schema'; s_name dba_sequences.sequence_name%TYPE := '&seq'; s_cycle dba_sequences.cycle_flag%TYPE; s_cache dba_sequences.cache_size%TYPE; mn_number dba_sequences.min_value%TYPE; mx_number dba_sequences.max_value%TYPE; s_number dba_sequences.last_number%TYPE; e_number dba_sequences.last_number%TYPE; increment dba_sequences.last_number%TYPE; s_seqnbr dba_sequences.last_number%TYPE := &seqnbr; s_seqnbr2 dba_sequences.last_number%TYPE; s_loop dba_sequences.last_number%TYPE; s_count dba_sequences.last_number%TYPE; s_command varchar2(100); s_seq_all varchar2(100); c_cache varchar2(30) := 'cache 20'; -- default c_cycle varchar2(30) := 'nocycle'; c_maxvalue varchar2(30); s_phase varchar2(15);
SELECT *
INTO s_sequences
FROM dba_sequences
WHERE sequence_owner = upper(s_owner) AND sequence_name =
upper(s_name);
IF (sqlcode != 0)
THEN
DBMS_OUTPUT.PUT_LINE('sqlcode='||sqlcode||' owner='||s_owner||'
sequence='||s
_name);
DBMS_OUTPUT.PUT_LINE('Exit from code because sequence does not
exist in schem
a');
raise leave_exception;
END IF;
/* -- setup for alter to trick sequence number and finally */
s_cycle := s_sequences.cycle_flag; s_cache := s_sequences.cache_size; mn_number := s_sequences.min_value; mx_number := s_sequences.max_value; s_number := s_sequences.last_number; e_number := s_sequences.last_number - 1; s_seq_all :=
/* -- phase prequel start */s_phase := 'Phase prequel';
DBMS_OUTPUT.PUT_LINE('Sequence found:
owner='||s_sequences.sequence_owner||' seq
uence='||s_sequences.sequence_name);
DBMS_OUTPUT.PUT_LINE('original values');
DBMS_OUTPUT.PUT_LINE('increment='||increment||'
minvalue='||mn_number||' maxvalu
e='||mx_number||' cycle='||s_cycle||' cache='||s_cache);
IF s_seqnbr2 >= mx_number
THEN
DBMS_OUTPUT.PUT_LINE('EXIT because sequence cannot be reset greater
than maxva
lue');
raise leave_exception;
END IF;
s_loop := s_seqnbr2 - 1; -- increment must be less that maxvalue -
minvalue and
minvalue < last_number
IF s_loop >= s_number
THEN
DBMS_OUTPUT.PUT_LINE('EXIT minvalue cannot exceed current value');
raise leave_exception;
END IF;
/* -- phase I update sequence temporarily */
s_phase := 'Phase I';
DBMS_OUTPUT.PUT_LINE('min or max cannot exceed last value');
s_command := 'alter sequence '||s_seq_all||' increment by 1 minvalue
'||s_loop |
|' maxvalue '||s_number||' cycle nocache';
DBMS_OUTPUT.PUT_LINE('command executed: ' || s_command);
execute immediate s_command;
IF (sqlcode != 0)
THEN
DBMS_OUTPUT.PUT_LINE('*******************************************************
DBMS_OUTPUT.PUT_LINE('*Exit from code because sequence alter failed
phase I c
heck*');
DBMS_OUTPUT.PUT_LINE('*Can be restarted after correcting error since alter
*');
DBMS_OUTPUT.PUT_LINE('*did not take place
*');
DBMS_OUTPUT.PUT_LINE('*******************************************************
raise leave_exception;
END IF;
DBMS_OUTPUT.PUT_LINE('***********************');DBMS_OUTPUT.PUT_LINE('*Passed Phase I alter*');
DBMS_OUTPUT.PUT_LINE('***********************');
/* -- phase II reset start with sequence via loop */ s_phase := 'Phase II';
s_command := 'alter sequence '||s_seq_all||' increment by 1';
DBMS_OUTPUT.PUT_LINE('command executed: ' || s_command);
execute immediate s_command;
IF (sqlcode != 0)
THEN
DBMS_OUTPUT.PUT_LINE('*******************************************************
DBMS_OUTPUT.PUT_LINE('*phase II failure alter
*');
DBMS_OUTPUT.PUT_LINE('*alter to loop did not work
*');
DBMS_OUTPUT.PUT_LINE('*check for errors
*');
DBMS_OUTPUT.PUT_LINE('*manual sequence is required
*');
DBMS_OUTPUT.PUT_LINE('*******************************************************
raise leave_exception;
END IF;
DBMS_OUTPUT.PUT_LINE('***********************');DBMS_OUTPUT.PUT_LINE('*Passed Phase II alter*');
DBMS_OUTPUT.PUT_LINE('***********************');
s_command := 'SELECT '||s_seq_all||'.'||'NEXTVAL FROM DUAL';
DBMS_OUTPUT.PUT_LINE('command executed: ' || s_command);
-- execute
execute immediate s_command;
execute immediate s_command;
IF (sqlcode != 0)
THEN
DBMS_OUTPUT.PUT_LINE('*******************************************************
DBMS_OUTPUT.PUT_LINE('*phase II failure select
*');
DBMS_OUTPUT.PUT_LINE('*did not take place
*');
DBMS_OUTPUT.PUT_LINE('*check for errors
*');
DBMS_OUTPUT.PUT_LINE('*manual sequence is required
*');
DBMS_OUTPUT.PUT_LINE('*******************************************************
raise leave_exception;
END IF;
DBMS_OUTPUT.PUT_LINE('**************************'); DBMS_OUTPUT.PUT_LINE('*Passed Phase II select *');DBMS_OUTPUT.PUT_LINE('*'||s_count||' start with*');
DBMS_OUTPUT.PUT_LINE('**************************');
/* -- phase III update sequence permanently */
/* -- reset cache */
s_phase := 'Phase III';
IF s_cache = 0
THEN
c_cache := 'nocache';
ELSE
c_cache := 'cache '||s_cache;
END IF;
/* -- reset cycle */
IF s_cycle = 'Y'
THEN
c_cycle := 'cycle';
END IF;
/* -- reset maxvalue */
c_maxvalue := 'maxvalue '||mx_number;
IF s_seqnbr2 = to_number('1e27')
THEN
c_maxvalue := 'nomaxvalue';
END IF;
s_command := 'alter sequence '||s_seq_all||' increment by
'||increment||' minval
ue '||mn_number||' '|| c_cycle ||' '||c_cache||' '||c_maxvalue;
DBMS_OUTPUT.PUT_LINE('command executed: ' || s_command);
execute immediate s_command;
IF (sqlcode != 0)
THEN
DBMS_OUTPUT.PUT_LINE('*******************************************************
DBMS_OUTPUT.PUT_LINE('*Phase III failure alter
*');
DBMS_OUTPUT.PUT_LINE('*check for errors
*');
DBMS_OUTPUT.PUT_LINE('*manual sequence is required
*');
DBMS_OUTPUT.PUT_LINE('*******************************************************
/* -- exceptions */
EXCEPTION
WHEN leave_exception
THEN
DBMS_OUTPUT.PUT_LINE('************************************'); DBMS_OUTPUT.PUT_LINE('Process did not reach end of job'); DBMS_OUTPUT.PUT_LINE('Stopped in '||s_phase); DBMS_OUTPUT.PUT_LINE('SQLCODE -- ' || sqlcode);DBMS_OUTPUT.PUT_LINE('SQLERRM -- ' || sqlerrm);
DBMS_OUTPUT.PUT_LINE('************************************');WHEN no_data_found
THEN
DBMS_OUTPUT.PUT_LINE('*****************************************');DBMS_OUTPUT.PUT_LINE('sqlcode='||sqlcode||' owner='||s_owner||' sequence='||
DBMS_OUTPUT.PUT_LINE('*Exit sequence does not exist in schema*'); DBMS_OUTPUT.PUT_LINE('* no data *'); DBMS_OUTPUT.PUT_LINE('*****************************************');WHEN OTHERS
DBMS_OUTPUT.PUT_LINE('************************************'); DBMS_OUTPUT.PUT_LINE('Below error noted program exiting*'); DBMS_OUTPUT.PUT_LINE('Stopped in '||s_phase ); DBMS_OUTPUT.PUT_LINE('SQLCODE -- ' || sqlcode );DBMS_OUTPUT.PUT_LINE('SQLERRM -- ' || sqlerrm);
DBMS_OUTPUT.PUT_LINE('************************************');END;
![]() |
![]() |