sql >> Databáze >  >> RDS >> Oracle

Resetujte Oracle Sequence tak, aby měla MIN HODNOTU =1 a STARTOVNÍ číslo od 1

Můžete to udělat ve dvou krocích:

  • přírůstek_o hodnotu o jednu menší než aktuální hodnota sekvence.
  • resetujte increment_by zpět na 1.

Logika je taková, že neměli byste sekvenci snižovat zpět na nulu , protože minimální hodnota chcete 1 , takže nextval nemůže být menší než minval .

Například,

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

Tedy min_value a přírůstek_o je nyní resetováno1 respektive. další hodnota může být 1 pouze jednou, než resetujete increment_by1 znovu.

Nevidím tedy žádné praktické využití toho, čeho chcete dosáhnout. Lze to však provést, jak je ukázáno výše.

Chcete-li do svého postupu implementovat výše uvedenou logiku, postupujte takto:

Nastavení

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

Upravte svůj postup jako:

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

Jak jsem řekl, nevidím žádné praktické využití . Váš další je prakticky použitelný až od 2 . Když je 1 , musíte provést ALTER SEQUENCE ještě jednou a resetujte přírůstek_po zpět na 1 .




  1. Kurzorový výraz v MySQL

  2. Nahrajte více souborů na server, přičemž php nenahrává na server všechny soubory

  3. sql selectL řádky do sloupců bez poddotazu

  4. mysql:duplikovat určité řádky pomocí SQL?