sql >> Base de Datos >  >> RDS >> Oracle

Restablezca Oracle Sequence para tener MIN VALUE =1 y STARTING number desde 1

Puedes hacerlo en dos pasos:

  • incrementar_por valor uno menos que el valor actual de la secuencia.
  • restablecer increment_by de nuevo a 1.

La lógica es que, no deberías reducir la secuencia a cero , ya que el minvalue lo que quieres es 1 , entonces, el nextval no puede ser menor que el minval .

Por ejemplo,

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

Entonces, el min_value y incrementar_por ahora es restablecer a 1 respectivamente. El siguiente valor podría ser 1 solo una vez antes de restablecer el increment_by a 1 otra vez.

Entonces, no veo ningún uso práctico de lo que quieres lograr. Sin embargo, podría hacerse como se demostró anteriormente.

Para implementar la lógica anterior en su procedimiento, haga lo siguiente:

Configuración

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

Modifica tu procedimiento como:

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

Como dije, no le veo ningún uso práctico . Tu nextval es prácticamente utilizable solo desde 2 . Cuando es 1 , necesitas hacer un ALTER SEQUENCE una vez más para restablecer el increment_by volver a 1 .