Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Setzen Sie die Oracle-Sequenz zurück, um MIN VALUE =1 und die STARTING-Nummer von 1 zu haben

Sie können dies in zwei Schritten tun:

  • increment_by Wert um eins kleiner als der aktuelle Wert der Sequenz.
  • increment_by auf 1 zurücksetzen.

Die Logik ist, dass Sie die Sequenz nicht zurück auf Null dekrementieren sollten , da der minvalue Sie wollen ist 1 , also darf nextval nicht kleiner als minval sein .

Zum Beispiel

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

Also der min_value und increment_by ist jetzt zurückgesetzt zu 1 beziehungsweise. Der nächste Wert könnte nur einmal 1 sein, bevor Sie increment_by zurücksetzen zu 1 wieder.

Ich sehe also keinen praktischen Nutzen für das, was Sie erreichen möchten. Es könnte jedoch wie oben gezeigt durchgeführt werden.

Gehen Sie wie folgt vor, um die obige Logik in Ihrer Prozedur zu implementieren:

Einrichtung

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

Ändern Sie Ihr Verfahren 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

Wie gesagt, ich sehe darin keinen praktischen Nutzen . Ihr nächster Wert ist praktisch erst ab 2 nutzbar . Wenn es 1 ist , müssen Sie eine ALTER SEQUENCE ausführen erneut, um increment_by zurückzusetzen zurück zu 1 .