Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Đặt lại Trình tự Oracle để có MIN VALUE =1 và số STARTING từ 1

Bạn có thể thực hiện theo hai bước:

  • giá trị tăng_ theo giá trị nhỏ hơn một giá trị so với giá trị hiện tại của chuỗi.
  • đặt lại increment_by trở lại 1.

Logic là bạn không nên giảm trình tự về 0 , kể từ giá trị tối thiểu bạn muốn là 1 , do đó, giá trị tiếp theo không được nhỏ hơn giá trị tối thiểu .

Ví dụ:

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

Vì vậy, min_value increment_by hiện được đặt lại thành 1 tương ứng. Giá trị tiếp theo chỉ có thể là 1 lần trước khi bạn đặt lại increment_by thành 1 lại.

Vì vậy, tôi không thấy bất kỳ công dụng thực tế nào của những gì bạn muốn đạt được. Tuy nhiên, nó có thể được thực hiện như đã trình bày ở trên.

Để triển khai logic trên trong quy trình của bạn, hãy làm như sau:

Thiết lập

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

Sửa đổi quy trình của bạn như:

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

Như tôi đã nói, Tôi không thấy bất kỳ công dụng thực tế nào của nó . lần tiếp theo của bạn thực tế chỉ có thể sử dụng từ 2 . Khi nó là 1 , bạn cần thực hiện ALTER SEQUENCE một lần nữa để đặt lại increment_by quay lại 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. truy vấn phụ - đạt điểm cao nhất

  2. Hiển thị mức sử dụng CPU oracle cho các phiên dưới dạng phần trăm

  3. Đóng hay không đóng Kết nối Oracle?

  4. Số nhận dạng ORA-00972 là tên cột bí danh quá dài

  5. Phát hiện xem một giá trị có chứa ít nhất một chữ số trong Oracle hay không