190 votes

Comment réinitialiser une séquence dans Oracle ?

En PostgreSQL, je peux faire quelque chose comme ceci :

Yat-il un équivalent de Oracle ?

162voto

Dougman Points 4517

Voici une bonne procédure de réinitialisation de toutes les séquences de 0 à partir d'Oracle guru Tom Kyte. Grande discussion sur les avantages et les inconvénients dans les liens ci-dessous.

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;
/

À partir de cette page: SQL Dynamique pour réinitialiser la valeur de la séquence
Un bon sujet de discussion est également ici: Comment faire pour réinitialiser les séquences?

117voto

Mo. Points 6747

Un vrai redémarrage n’est pas possible autant que je sache. (S’il vous plaît me corriger si je me trompe !).

Toutefois, si vous souhaitez le mettre à 0, vous pouvez simplement supprimer et le recréer.

Si vous souhaitez affecter une valeur spécifique, vous pouvez définir l’incrément sur une valeur négative et obtenir la valeur suivante.

Autrement dit, si votre séquence est à 500, vous pouvez le définir à 100 par

51voto

Gina Points 231

Il s’agit de mon approche :

  1. laisser tomber la séquence
  2. le recréer

Exemple :

34voto

Allbite Points 1365

Mon approche est un teensy extension de Dougman l'exemple.

Les Extensions sont...

Passer à la valeur de départ comme un paramètre. Pourquoi? J'aime à appeler la chose la réinitialisation de la séquence de retour à la max ID utilisé dans certains de la table. J'arrive à la fin de l'appel de cette proc partir d'un autre script qui exécute plusieurs appels pour tout un tas de séquences, la réinitialisation de nextval, retour à un certain niveau qui est suffisamment élevée pour ne pas causer des violations de clé primaire où je suis en utilisant la séquence de la valeur d'un identificateur unique.

Il a également les honneurs de la précédente minvalue. En fait, il peut pousser à la prochaine valeur de plus en plus élevés si l' p_val ou existantes minvalue sont plus élevé que le courant ou calculée suivant la valeur.

Le meilleur de tous, il peut être appelé à rétablir la valeur spécifiée, et attendez de voir le wrapper "corriger toutes mes séquences" procédure à la fin.

create or replace
procedure Reset_Sequence( p_seq_name in varchar2, p_val in number default 0)
is
  l_current number := 0;
  l_difference number := 0;
  l_minvalue user_sequences.min_value%type := 0;

begin

  select min_value
  into l_minvalue
  from user_sequences
  where sequence_name = p_seq_name;

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

  if p_Val < l_minvalue then
    l_difference := l_minvalue - l_current;
  else
    l_difference := p_Val - l_current;
  end if;

  if l_difference = 0 then
    return;
  end if;

  execute immediate
    'alter sequence ' || p_seq_name || ' increment by ' || l_difference || 
       ' minvalue ' || l_minvalue;

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

  execute immediate
    'alter sequence ' || p_seq_name || ' increment by 1 minvalue ' || l_minvalue;
end Reset_Sequence;

Cette procédure est utile en soi, mais maintenant, nous allons en ajouter un autre qui l'appelle et précise tout par programmation avec une séquence de convention de nommage et de la recherche de la valeur maximale utilisée dans une table existante/champ...

create or replace
procedure Reset_Sequence_to_Data(
  p_TableName varchar2,
  p_FieldName varchar2
)
is
  l_MaxUsed NUMBER;
BEGIN

  execute immediate
    'select coalesce(max(' || p_FieldName || '),0) from '|| p_TableName into l_MaxUsed;

  Reset_Sequence( p_TableName || '_' || p_Fieldname || '_SEQ', l_MaxUsed );

END Reset_Sequence_to_Data;

Maintenant, nous sommes de cuisson au gaz!

La procédure ci-dessus va vérifier pour un champ maximum de valeur dans un tableau, construit un nom de la séquence à partir de la table/champ paire et appelle *"Reset_Sequence"* avec qui sentait la valeur maximum.

La dernière pièce de ce puzzle, et la cerise sur le gâteau vient ensuite...

create or replace
procedure Reset_All_Sequences
is
BEGIN

  Reset_Sequence_to_Data( 'ACTIVITYLOG', 'LOGID' );
  Reset_Sequence_to_Data( 'JOBSTATE', 'JOBID' );
  Reset_Sequence_to_Data( 'BATCH', 'BATCHID' );

END Reset_All_Sequences;

Dans ma base de données il y a une centaine d'autres séquences à être remis à zéro par le biais de ce mécanisme, donc il y a 97 plus d'appels à l' *Reset_Sequence_to_Data* dans la procédure que ci-dessus.

L'amour? Il déteste? Indifférent?

10voto

Navin Points 41

Le script suivant définie la séquence à une valeur désirée :

Étant donné une séquence fraîchement créée nommé PCS_PROJ_KEY_SEQ et tableau PCS_PROJ :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X