Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

Oracle अनुक्रम को MIN VALUE =1 और STARTING संख्या 1 . से प्राप्त करने के लिए रीसेट करें

आप इसे दो चरणों में कर सकते हैं:

  • 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 पर वापस जाएं ।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle पैकेज अमान्य होने के लिए किन स्थितियों का कारण बनता है?

  2. Oracle (Old?) Joins - रूपांतरण के लिए एक टूल/स्क्रिप्ट?

  3. ORA-01031 प्राप्त करना:ORA-00942 के बजाय तालिका को क्वेरी करते समय अपर्याप्त विशेषाधिकार:तालिका या दृश्य मौजूद नहीं है

  4. Oracle फ़ंक्शन को कॉल करने के लिए स्प्रिंग SimpleJdbcCall के साथ संघर्ष

  5. SQL FOR-IN (SELECT) लूप में एक स्ट्रिंग वेरिएबल के मान का उपयोग करें