Как я сбрасываю последовательность в Oracle?

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
159
задан Stevoisiak supports Monica 25 August 2017 в 15:48
поделиться

7 ответов

Вот хорошая процедура сброса любой последовательности к 0 от гуру Oracle Tom Kyte . Большое обсуждение за и против в ссылках ниже также.

tkyte@TKYTE901.US.ORACLE.COM> 
create or replace
procedure reset_seq( p_seq_name in varchar2 )
is
    l_val number;
begin
    execute immediate
    'select ' || p_seq_name || '.nextval from dual' INTO l_val;

    execute immediate
    'alter sequence ' || p_seq_name || ' increment by -' || l_val || 
                                                          ' minvalue 0';

    execute immediate
    'select ' || p_seq_name || '.nextval from dual' INTO l_val;

    execute immediate
    'alter sequence ' || p_seq_name || ' increment by 1 minvalue 0';
end;
/

От этой страницы: Динамический SQL для сброса значения последовательности
Другое хорошее обсуждение также здесь: , Как сбросить последовательности?

142
ответ дан Doug Porter 23 November 2019 в 21:34
поделиться

Изменение ИНКРЕМЕНТНОГО значения последовательности, постепенное увеличение его и затем изменение его назад являются довольно безболезненными, плюс Вы обладают дополнительным преимуществом не необходимости восстановить все предоставления, как Вы были бы, имел Вас, отбросил/воссоздал последовательность.

2
ответ дан Peter Mortensen 23 November 2019 в 21:34
поделиться

Истинный перезапуск не возможен AFAIK. (Исправьте меня, если я неправ!).

Однако, если Вы хотите установить его на 0, можно просто удалить и воссоздать его.

, Если Вы хотите установить его на определенное значение, можно установить ИНКРЕМЕНТ на отрицательную величину и получить следующее значение.

таким образом, если Ваша последовательность в 500, можно установить ее на 100 через

ALTER SEQUENCE serial INCREMENT BY -400;
SELECT serial.NEXTVAL FROM dual;
ALTER SEQUENCE serial INCREMENT BY 1;
89
ответ дан Jon Heller 23 November 2019 в 21:34
поделиться

Хранимая процедура, которая работала на меня

create or replace
procedure reset_sequence( p_seq_name in varchar2, tablename in varchar2 )
is
    l_val number;
    maxvalueid number;
begin
    execute immediate 'select ' || p_seq_name || '.nextval from dual' INTO l_val;
    execute immediate 'select max(id) from ' || tablename INTO maxvalueid;
    execute immediate 'alter sequence ' || p_seq_name || ' increment by -' || l_val || ' minvalue 0';
    execute immediate 'select ' || p_seq_name || '.nextval from dual' INTO l_val;
    execute immediate 'alter sequence ' || p_seq_name || ' increment by '|| maxvalueid ||' minvalue 0';  
    execute immediate 'select ' || p_seq_name || '.nextval from dual' INTO l_val;
    execute immediate 'alter sequence ' || p_seq_name || ' increment by 1 minvalue 0';
end;

, Как использовать хранимую процедуру:

execute reset_sequence('company_sequence','company');
-1
ответ дан 23 November 2019 в 21:34
поделиться

Эта хранимая процедура перезапускает мою последовательность:

Create or Replace Procedure Reset_Sequence  
  is
  SeqNbr Number;
begin
   /*  Reset Sequence 'seqXRef_RowID' to 0    */
   Execute Immediate 'Select seqXRef.nextval from dual ' Into SeqNbr;
   Execute Immediate 'Alter sequence  seqXRef increment by - ' || TO_CHAR(SeqNbr) ;
   Execute Immediate 'Select seqXRef.nextval from dual ' Into SeqNbr;
   Execute Immediate 'Alter sequence  seqXRef increment by 1';
END;

/

5
ответ дан 23 November 2019 в 21:34
поделиться

1) Suppose you create a SEQUENCE like shown below:

CREATE SEQUENCE TESTSEQ
INCREMENT BY 1
MINVALUE 1
MAXVALUE 500
NOCACHE
NOCYCLE
NOORDER

2) Now you fetch values from SEQUENCE. Lets say I have fetched four times as shown below.

SELECT TESTSEQ.NEXTVAL FROM dual
SELECT TESTSEQ.NEXTVAL FROM dual
SELECT TESTSEQ.NEXTVAL FROM dual
SELECT TESTSEQ.NEXTVAL FROM dual

3) After executing above four commands the value of the SEQUENCE will be 4. Now suppose I have reset the value of the SEQUENCE to 1 again. The follow the following steps. Follow all the steps in the same order as shown below:

  1. ALTER SEQUENCE TESTSEQ INCREMENT BY -3;
  2. SELECT TESTSEQ.NEXTVAL FROM dual
  3. ALTER SEQUENCE TESTSEQ INCREMENT BY 1;
  4. SELECT TESTSEQ.NEXTVAL FROM dual
2
ответ дан 23 November 2019 в 21:34
поделиться

Это мой подход:

  1. отбросить последовательность
  2. воссоздать ее

Пример:

--Drop sequence

DROP SEQUENCE MY_SEQ;

-- Create sequence 

create sequence MY_SEQ
minvalue 1
maxvalue 999999999999999999999
start with 1
increment by 1
cache 20;
45
ответ дан 23 November 2019 в 21:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: