Oracle 9 - la Réinitialisation de la Séquence pour correspondre à l'état de la table
J'ai une séquence permet de semences mon (Entier) de clés primaires dans une table oracle.
Il semble que cette séquence n'a pas toujours été utilisé pour insérer de nouvelles valeurs dans la table. Comment puis-je obtenir la séquence à l'étape de retour avec les valeurs réelles dans la table?
OriginalL'auteur AJM | 2009-09-15
Vous devez vous connecter pour publier un commentaire.
Si l'ID est le nom de votre PK colonne et PK_SEQ est le nom de votre séquence:
Trouver la valeur de la plus haute PK par
SELECT MAX(ID) from tableName
Trouver la valeur de la prochaine PK_SEQ par
SÉLECTIONNEZ PK_SEQ.NEXTVAL DE DOUBLE
fait, en supposant que vous traiter ces
des valeurs comme de véritables clés de substitution
saut à la max ID en MODIFIER la SÉQUENCE
PK_SEQ INCRÉMENTATION [#1 - #2
valeur]
Bosse de la séquence, SÉLECTIONNEZ
PK_SEQ.NEXTVAL DE DOUBLE
Réinitialiser la séquence valeur d'incrément
de 1 par MODIFIER la SÉQUENCE de PK_SEQ
INCRÉMENT DE 1
Tout cela suppose que vous n'avez pas de nouvelles insertions dans la table pendant que vous faites cela...
Le but de l'étape 3 est juste pour comparer la plus grande valeur de clé primaire de la prochaine valeur de la séquence. Ainsi, par exemple, si le SÉLECTIONNER à partir de l'étape 1 a abouti à un résultat de 100, et de le SÉLECTIONNER à partir de l'étape 2 s'est soldé par un résultat de 90 cela signifie que vous pouvez "sauter" 11 séquences. Lorsque vous modifiez la séquence dans l'étape 4, SÉLECTIONNEZ à l'étape 5 de déplacer la séquence de 10 valeurs, à 100. Après l'incrémentation est réinitialisé à l'étape 6, le suivant "SÉLECTIONNEZ PK_SEQ.NEXTVAL DE DOUBLE" vous donnera 101.
Dans l'étape 4, je ne peux pas obtenir la syntaxe pour faire une soustraction dans l'Incrément de la clause. J'ai essayé [a-b] a-b et selecr a-b à partir de la double, mais sans aucun succès.
Désolé, il semble que je n'étais pas claire, vous devez déterminer la valeur (disons N), puis utiliser l'instruction ALTER SÉQUENCE PK_SEQ INCRÉMENT PAR N" - j'ai été en utilisant la syntaxe, j'ai fourni comme une sorte de pseudo-code.
Je l'avais essayé, mais le problème était un syntaticall question par laquelle j'ai été bêtement de ne pas ajouter ma variable proparly par exemple, EXÉCUTER IMMÉDIAT "MODIFIER la SÉQUENCE de NEXT_VALIDATED_TABLE_ID INCRÉMENT PAR' || N ;
OriginalL'auteur dpbradley
En bref, jeu:
Vous pouvez obtenir le max valeur de la séquence utilisée à l'intérieur de votre table, faites le calcul, et la mise à jour de la séquence en conséquence.
OriginalL'auteur David Andres
Je pense que c'est à cause de
select YOURSEQUENCE.NEXTVAL into sequenceValue from dual;
à la ligne 7, vous pouvez vérifier une alternative à ma réponse à https://stackoverflow.com/a/45542069/1737973, qui récupèreall_sequences.last_number WHERE sequence_name = 'YOURSEQUENCE'
au lieu deYOURSEQUENCE.NEXTVAL
, probablement à obtenir la valeur désirée séquence donnée de la valeur mise en cache désactivé.OriginalL'auteur Dieter DHoker
J'ai fait ce script que je n'ai pas trouvé de script en ligne dynamiquement définit tous mon séquences dans le courant ID plus. Testé sur Oracle 11.2.0.4.
OriginalL'auteur Blama
Dans certains cas, vous pouvez trouver plus facile de simplement obtenir le courant max de la valeur et puis
L'application sera interrompue après la chute. Mais qui va garder tout le monde à partir de l'insertion de lignes au cours de cette période, et la création d'une séquence est rapide. Assurez-vous de recréer toutes les subventions sur la séquence, puisque ceux-ci seront supprimés lors de la séquence. Et vous pouvez manuellement recompiler tout plsql qui dépend de la séquence.
OriginalL'auteur Jim Hudson
En ajoutant jusqu'à https://stackoverflow.com/a/15929548/1737973, mais sans recourir à
SEQUENCENAME.NEXTVAL
par conséquent, ne résultant pas en une position plutôt qu'il devrait être:Avertissement: si la séquence est d'utiliser la mise en cache (
all_sequences.cache_size
ensemble de plus grand que 0) vous êtes probablement désireux de prendre en considération, dans l' Calculer la différence étape.Documentation Oracle pour
toutes les séquences
....OriginalL'auteur uprego