आप इसे दो चरणों में कर सकते हैं:
- increment_by मान अनुक्रम के वर्तमान मान से एक कम है।
- increment_by को वापस 1 पर रीसेट करें।
तर्क यह है कि, आपको अनुक्रम को वापस शून्य पर नहीं घटाना चाहिए , न्यूनतम . के बाद से आप चाहते हैं 1
, इसलिए, अगला मिनवल से कम नहीं हो सकता ।
उदाहरण के लिए,
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
क्रमश। अगला मान increment_by . को रीसेट करने से पहले केवल 1 बार हो सकता है करने के लिए 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
हो , आपको एक ALTER SEQUENCE . करने की आवश्यकता है increment_by . को रीसेट करने के लिए एक बार फिर से 1
पर वापस जाएं ।