Bạn có thể thực hiện theo hai bước:
- giá trị tăng_ theo giá trị nhỏ hơn một giá trị so với giá trị hiện tại của chuỗi.
- đặt lại increment_by trở lại 1.
Logic là bạn không nên giảm trình tự về 0 , kể từ giá trị tối thiểu bạn muốn là 1
, do đó, giá trị tiếp theo không được nhỏ hơn giá trị tối thiểu .
Ví dụ:
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
Vì vậy, min_value và increment_by hiện được đặt lại thành 1
tương ứng. Giá trị tiếp theo chỉ có thể là 1 lần trước khi bạn đặt lại increment_by thành 1
lại.
Vì vậy, tôi không thấy bất kỳ công dụng thực tế nào của những gì bạn muốn đạt được. Tuy nhiên, nó có thể được thực hiện như đã trình bày ở trên.
Để triển khai logic trên trong quy trình của bạn, hãy làm như sau:
Thiết lập
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
Sửa đổi quy trình của bạn như:
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
Như tôi đã nói, Tôi không thấy bất kỳ công dụng thực tế nào của nó . lần tiếp theo của bạn thực tế chỉ có thể sử dụng từ 2
. Khi nó là 1
, bạn cần thực hiện ALTER SEQUENCE một lần nữa để đặt lại increment_by quay lại 1
.