sql >> データベース >  >> RDS >> Oracle

Oracleシーケンスをリセットして、MIN VALUE=1およびSTARTING番号を1から設定します。

    あなたは2つのステップでそれを行うことができます:

    • increment_by値はシーケンスの現在の値より1つ小さくなります。
    • 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へ それぞれ。 次の値 incremental_by をリセットする前に、1になる可能性があるのは1回だけです。 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. Ubuntuサーバー17.04php7およびapache2でoci8.soをロード中にエラーが発生しました

    2. caseステートメント(MYSQL)を使用して、別のテーブルの値に基づいて1つのテーブルを更新します

    3. PostgreSQLスキーマのテーブルを一覧表示します

    4. ストアドプロシージャを使用して、SQLServer2005の文字列にサブ文字列が含まれているかどうかを確認します