Anda dapat melakukannya dalam dua langkah:
- tambahkan nilai satu kurang dari nilai urutan saat ini.
- setel ulang increment_by kembali ke 1.
Logikanya adalah, Anda tidak boleh mengurangi urutan kembali ke nol , karena nilai minimum yang Anda inginkan adalah 1
, jadi, nextval tidak boleh kurang dari minval .
Misalnya,
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
Jadi, min_value dan bertambah_berdasarkan sekarang setel ulang ke 1
masing-masing. Nilai berikutnya bisa jadi 1 hanya sekali sebelum Anda menyetel ulang increment_by ke 1
lagi.
Jadi, saya tidak melihat penggunaan praktis dari apa yang ingin Anda capai. Namun, itu bisa dilakukan seperti yang ditunjukkan di atas.
Untuk menerapkan logika di atas dalam prosedur Anda, lakukan hal berikut:
Penyiapan
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
Ubah prosedur Anda sebagai:
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
Seperti yang saya katakan, Saya tidak melihat penggunaan praktisnya . berikutnya . Anda praktis hanya dapat digunakan dari 2
. Saat itu 1
, Anda perlu melakukan ALTER SEQUENCE sekali lagi untuk menyetel ulang increment_by kembali ke 1
.