Можете да го направите в две стъпки:
- increment_by стойност с едно по-малко от текущата стойност на последователността.
- нулирайте increment_by обратно на 1.
Логиката е, че не трябва да намалявате последователността обратно до нула , тъй като минималната стойност което искате е 1
, така че nextval не може да бъде по-малко от minval .
Например,
SQL> CREATE SEQUENCE s START WITH 20 MINVALUE 0 INCREMENT BY 1;
Sequence created.
SQL> SELECT s.nextval FROM dual;
NEXTVAL
----------
20
SQL> ALTER SEQUENCE s INCREMENT BY -19 MINVALUE 1;
Sequence altered.
SQL> SELECT s.nextval FROM dual;
NEXTVAL
----------
1
SQL> ALTER SEQUENCE s INCREMENT BY 1 MINVALUE 1;
Sequence altered.
SQL> SELECT s.nextval FROM dual;
NEXTVAL
----------
2
SQL> SELECT min_value, increment_by FROM user_sequences WHERE sequence_name='S';
MIN_VALUE INCREMENT_BY
---------- ------------
1 1
И така, min_value и increment_by вече е нулиран към 1
съответно. Следващата стойност може да бъде 1 само веднъж, преди да нулирате increment_by към 1
отново.
Така че не виждам практическа полза от това, което искате да постигнете. Въпреки това може да се направи, както е показано по-горе.
За да приложите горната логика във вашата процедура, направете следното:
Настройка
SQL> DROP SEQUENCE S;
Sequence dropped.
SQL> CREATE SEQUENCE s START WITH 20 MINVALUE 0 INCREMENT BY 1;
Sequence created.
SQL> SELECT s.nextval FROM dual;
NEXTVAL
----------
20
Променете вашата процедура като:
SQL> CREATE OR REPLACE PROCEDURE reset_seq(
2 p_seq_name IN VARCHAR2 )
3 IS
4 l_val NUMBER;
5 BEGIN
6 EXECUTE IMMEDIATE 'select ' || p_seq_name || '.nextval from dual' INTO l_val;
7 l_val := l_val - 1;
8 dbms_output.put_line('l_val = '||l_val);
9 EXECUTE IMMEDIATE 'alter sequence ' ||
10 p_seq_name || ' increment by -' || l_val || ' minvalue 1';
11 EXECUTE IMMEDIATE 'select ' || p_seq_name || '.nextval from dual' INTO l_val;
12 dbms_output.put_line('1st Nextval is '||l_val);
13 EXECUTE IMMEDIATE 'alter sequence ' || p_seq_name ||
14 ' increment by 1 MINVALUE 1';
15 EXECUTE IMMEDIATE 'select ' || p_seq_name || '.nextval from dual' INTO l_val;
16 dbms_output.put_line('2nd Nextval is '||l_val);
17 END;
18 /
Procedure created.
SQL> SET serveroutput ON
SQL> EXEC reset_seq('S');
l_val = 20
1st Nextval is 1
2nd Nextval is 2
PL/SQL procedure successfully completed.
SQL>
SQL> SELECT min_value, increment_by FROM user_sequences where sequence_name='S';
MIN_VALUE INCREMENT_BY
---------- ------------
1 1
Както казах, не виждам никаква практическа полза от него . Вашият следващ на практика може да се използва само от 2
. Когато е 1
, трябва да направите ПРОМЕНЯВАНЕ НА ПОСЛЕДОВАТЕЛНОСТ още веднъж, за да нулирате increment_by обратно към 1
.