En PostgreSQL, je peux faire quelque chose comme ceci :
Yat-il un équivalent de Oracle ?
En PostgreSQL, je peux faire quelque chose comme ceci :
Yat-il un équivalent de Oracle ?
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?
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
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?
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.