2017-01-17 20 views
0

問題シーケンスを「1」に戻すことができません。 私は以下のようにシーケンス...50ずつ増分するOracleシーケンスをリセットする

DROP SEQUENCE TEST_SEQ; 
CREATE SEQUENCE TEST_SEQ MINVALUE 1 START WITH 1 INCREMENT BY 50; 

をやって作成しました「のnextval」、出力は手順以下は1

SELECT TEST_SEQ.NEXTVAL FROM DUAL; --> output is '1' 

は私がリセットするために使用していますこのコミュニティからのものです私はnextValueメソッドチェックしたときに、私は51のような出力を取得しています。しかし、私はOUTPを必要とするシーケンスをリセットした後シーケンス

CREATE OR replace PROCEDURE RESET_SEQ(p_seq_name IN VARCHAR2) 
IS 
  l_val      NUMBER; 
  l_minvalue user_sequences.min_value%TYPE; 
BEGIN 
    SELECT min_value 
    INTO   l_minvalue 
    FROM   user_sequences 
    WHERE  sequence_name = Upper(p_seq_name); 

    EXECUTE IMMEDIATE 'SELECT '||p_seq_name||'.NEXTVAL FROM DUAL' INTO l_val; 

    l_val := l_val - l_minvalue; 

    EXECUTE IMMEDIATE 'ALTER SEQUENCE '||p_seq_name||'INCREMENT BY -'||l_val|| 
    'MINVALUE '||l_minvalue; 

    EXECUTE IMMEDIATE 'SELECT '||p_seq_name||'.NEXTVAL FROM DUAL' INTO l_val; 

    EXECUTE IMMEDIATE 'ALTER SEQUENCE '||p_seq_name||'INCREMENT BY 50 MINVALUE ' 
    ||l_minvalue; 
END; 
/

BEGIN 
RESET_SEQ('TEST_SEQ'); 
END; 
/

utを1とする。

SELECT TEST_SEQ.NEXTVAL FROM DUAL; - >出力は '51'です。

私がシーケンスをドロップして再作成するときだけ、次の値を '1'として得ることができます。

私の出力が「1」になるように上記の手順を変更してください。

+1

可能な重複[Iは、Oracleのシーケンスをリセットするにはどうすればよい?](http://stackoverflow.com/questions/51470/how-do-i-reset-a-sequence-in-oracle) – Aleksej

+0

可能性のある[Oracleの順序をリセットしてMIN VALUE = 1およびSTARTINGの値を1にする]の複製(http://stackoverflow.com/questions/30158866/reset-oracle-sequence-to-have-minvalue-1-and- 1からの開始数) – GurV

答えて

0

あなたはそれが

EXECUTE IMMEDIATE 'ALTER SEQUENCE '||p_seq_name||' INCREMENT BY -'||l_val|| 
'MINVALUE '||l_minvalue; 

同じことがその後

EXECUTE IMMEDIATE 'ALTER SEQUENCE '||p_seq_name||'INCREMENT BY 50 MINVALUE ' 
||l_minvalue; 

のために行くことにするためには

EXECUTE IMMEDIATE 'ALTER SEQUENCE '||p_seq_name||'INCREMENT BY -'||l_val|| 
'MINVALUE '||l_minvalue; 

にスペースを挿入する必要がありましたそれは動作するはずです。

DROP SEQUENCE TEST_SEQ; 
/
CREATE SEQUENCE TEST_SEQ MINVALUE 1 START WITH 1 INCREMENT BY 50; 
/
SELECT TEST_SEQ.NEXTVAL FROM DUAL; --> output is '1' 
/
SELECT TEST_SEQ.NEXTVAL FROM DUAL; --> output is '51' 
/
SELECT TEST_SEQ.CURRVAL FROM DUAL; --> output is '51' 
/
CREATE OR replace PROCEDURE RESET_SEQ(p_seq_name IN VARCHAR2) 
IS 
l_val  NUMBER; 
l_minvalue user_sequences.min_value%TYPE; 
BEGIN 
SELECT min_value 
INTO l_minvalue 
FROM user_sequences 
WHERE sequence_name = Upper(p_seq_name); 

EXECUTE IMMEDIATE 'SELECT '||p_seq_name||'.NEXTVAL FROM DUAL' INTO l_val; 

l_val := l_val - l_minvalue; 

EXECUTE IMMEDIATE 'ALTER SEQUENCE '||p_seq_name||' INCREMENT BY -'||l_val|| 
'MINVALUE '||l_minvalue; 

EXECUTE IMMEDIATE 'SELECT '||p_seq_name||'.NEXTVAL FROM DUAL' INTO l_val; 

EXECUTE IMMEDIATE 'ALTER SEQUENCE '||p_seq_name||' INCREMENT BY 50 MINVALUE ' 
||l_minvalue; 
END; 
/
BEGIN 
RESET_SEQ('TEST_SEQ'); 
END; 
/
SELECT TEST_SEQ.CURRVAL FROM DUAL; --> output is '1' 
/
1

エラーを確認して、実行するSQL文をに出力してください。そして、あなたはスタックオーバーフローの両方に持っていない。このため

EXECUTE IMMEDIATE 'SELECT '||p_seq_name||'.NEXTVAL FROM DUAL' INTO l_val; 

    l_val := l_val - l_minvalue; 

    EXECUTE IMMEDIATE 'ALTER SEQUENCE '||p_seq_name||'INCREMENT BY -'||l_val|| 
    'MINVALUE '||l_minvalue; 

    EXECUTE IMMEDIATE 'SELECT '||p_seq_name||'.NEXTVAL FROM DUAL' INTO l_val; 

    EXECUTE IMMEDIATE 'ALTER SEQUENCE '||p_seq_name||' INCREMENT BY 50 MINVALUE ' 
------------------------------------------------------^ space 
    ||l_minvalue; 
END; 

、私はそのような文字列を構築するためにreplace()を使用して好みます。例えば:

v_sql := 'ALTER SEQUENCE [p_seq_name] INCREMENT BY -[l_val] MINVALUE [l_minvalue]'; 
v_sql := replace(v_sql, '[p_seq_name]', p_seq_name); 
v_sql := replace(v_sql, '[l_val]', l_val); 
v_sql := replace(v_sql, '[l_minvalue]', l_minvalue); 
関連する問題