Сбросить последовательность автоматического приращения pl-sql - PullRequest
2 голосов
/ 20 сентября 2011

Как я могу сбросить первичный ключ с автоинкрементом?

У меня есть триггер doc_id_seq и триггер doc_pk_trg:

CREATE SEQUENCE doc_id_seq START WITH 1;

CREATE OR REPLACE TRIGGER doc_pk_trg
BEFORE INSERT ON TFIDF FOR EACH ROW
BEGIN  
 IF :NEW.doc_id IS NULL THEN    
   SELECT doc_id_seq.NEXTVAL INTO :NEW.doc_id FROM DUAL;  
     END IF;
     END;
 /

Я хочу узнать, сбросить последовательность.Как я могу это сделать ?

Ответы [ 3 ]

4 голосов
/ 20 сентября 2011

Вы можете использовать синтаксис ALTER SEQUENCE.

Том Кайт объясняет, как именно это сделать здесь:

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1119633817597

2 голосов
/ 20 сентября 2011

Просто отбросьте, а затем воссоздайте последовательность.

1 голос
/ 20 сентября 2011

Это то, как я мог бы сбросить его

CREATE OR REPLACE PROCEDURE reset_sequence (
   p_sequence_name   IN   VARCHAR2,
   p_new_value       IN   NUMBER
)
AS
   l_current_value     NUMBER;
   v_sequence_exists   NUMBER;
BEGIN
   SELECT 1
   INTO   v_sequence_exists
   FROM   user_sequences
   WHERE  sequence_name = p_sequence_name;

   EXECUTE IMMEDIATE 'SELECT ' || p_sequence_name || '.nextval FROM dual'
   INTO              l_current_value;

   /*Not possible to increment by 0 !*/
   IF (p_new_value - l_current_value - 1) != 0
   THEN
      EXECUTE IMMEDIATE    'ALTER SEQUENCE '
                        || p_sequence_name
                        || ' INCREMENT BY '
                        || (p_new_value - l_current_value - 1)
                        || ' MINVALUE 0';
   END IF;

   EXECUTE IMMEDIATE 'SELECT ' || p_sequence_name || '.nextval FROM dual'
   INTO              l_current_value;

   EXECUTE IMMEDIATE 'ALTER SEQUENCE ' || p_sequence_name || ' INCREMENT BY 1 ';
EXCEPTION
   WHEN NO_DATA_FOUND
   THEN
      raise_application_error (-20001, 'Sequence does not exist');
END;

Это дает дополнительное преимущество по сравнению с удалением и повторным созданием, которое не делает недействительными какие-либо зависимые объекты схемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...