sql >> Database >  >> RDS >> Oracle

Reset Oracle Sequence om MIN WAARDE =1 en START-nummer van 1 . te hebben

Je zou het in twee stappen kunnen doen:

  • waarde increment_by één minder dan de huidige waarde van de reeks.
  • increment_by terugzetten naar 1.

De logica is dat, je de reeks niet terug naar nul moet verlagen , sinds de minwaarde je wilt is 1 , dus de volgende waarde kan niet kleiner zijn dan de minval .

Bijvoorbeeld,

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

Dus de min_value en increment_by is nu reset naar 1 respectievelijk. De volgende waarde kan slechts één keer 1 zijn voordat u de increment_by . reset naar 1 opnieuw.

Dus ik zie geen praktisch nut van wat je wilt bereiken. Het kan echter worden gedaan zoals hierboven is aangetoond.

Ga als volgt te werk om de bovenstaande logica in uw procedure te implementeren:

Instellen

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

Wijzig uw procedure als:

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

Zoals ik al zei, Ik zie er geen praktisch nut van in . Je volgende is praktisch alleen bruikbaar vanaf 2 . Als het 1 is , moet u een ALTER SEQUENCE . doen nogmaals om de increment_by . te resetten terug naar 1 .




  1. Selecteer met dynamisch gegenereerde tabelnaam

  2. Validatie mislukt voor query voor methode JPQL

  3. Cluster-naar-clusterreplicatie configureren voor PostgreSQL

  4. Een database-e-mailaccount (SSMS) verwijderen