Oracle
 sql >> база данни >  >> RDS >> Oracle

Нулирайте последователността на Oracle, за да има МИН. СТОЙНОСТ =1 и НАЧАЛНО число от 1

Можете да го направите в две стъпки:

  • increment_by стойност с едно по-малко от текущата стойност на последователността.
  • нулирайте increment_by обратно на 1.

Логиката е, че не трябва да намалявате последователността обратно до нула , тъй като минималната стойност което искате е 1 , така че nextval не може да бъде по-малко от minval .

Например,

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 съответно. Следващата стойност може да бъде 1 само веднъж, преди да нулирате increment_by към 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 , трябва да направите ПРОМЕНЯВАНЕ НА ПОСЛЕДОВАТЕЛНОСТ още веднъж, за да нулирате 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. Групирайте по стойности, които са в последователност

  2. Oracle:SQL заявка, която връща редове само с числови стойности

  3. PL/SQL:конвертиране на явен курсор в референтен курсор?

  4. Изтриване на файлове от директория в съхранена процедура на Oracle

  5. Какъв е еквивалентът на таблицата Oracle Dual в MS SqlServer?