Hier hilft eine anständige Namenskonvention/Norm.
In Datenbanken, die ich entworfen habe, hat jede Tabelle einen 3 oder 4 Zeichen Alias, und wir nennen Dinge wie Indizes, Einschränkungen usw. mit diesem Alias.
Wenn eine Tabelle namens the_table einen Alias ttab hat, wäre die Primärschlüsselspalte ttab_id, die Primärschlüsseleinschränkung wäre pk_ttab und die Sequenz, die für ttab_id verwendet wird, wäre seq_ttab_id.
Vor diesem Hintergrund würden Sie jemanden wie die folgende (nicht getestet, so könnte ein wenig angepasst werden müssen, aber hoffentlich sollten Sie die allgemeine Idee) schreiben:
DECLARE
CURSOR cseq IS
SELECT sequence_name seqname FROM user_sequences;
tabname VARCHAR2(30);
colname VARCHAR2(30);
cmd VARCHAR2(1000);
maxval NUMBER;
BEGIN
FOR r IN cseq LOOP
/*
** Now get corresponding table/column name matching the sequence name
*/
SELECT table_name, column_name
INTO tabname, colname
FROM user_cons_columns #
WHERE column_name = REPLACE (r.seqname, 'SEQ_', '')
AND constraint_name = REPLACE(REPLACE(r.seqname, '_ID', ''), 'SEQ_', 'PK_');
/*
** Query the table to get the current maximum value - could use stats
*/
cmd := 'SELECT MAX(' || colname || ') FROM ' || tabname;
EXECUTE IMMEDIATE cmd INTO maxval;
/*
** Set sequence to inc by that amount
*/
cmd := 'alter sequence ' || r.seqname || ' INCREMENT BY ' || maxval;
EXECUTE IMMEDIATE cmd;
/*
** SELECT the sequence to bump its value up
*/
cmd := 'SELECT ' || r.seqname || '.nextval FROM DUAL';
EXECUTE IMMEDIATE cmd INTO maxval;
/*
** Set sequence inc by back down
*/
cmd := 'alter sequence ' || r.seqname || ' INCREMENT BY 1';
EXECUTE IMMEDIATE cmd;
END LOOP;
END;
/
Wenn Sie jedoch die nicht haben Bequemlichkeit der verwendbaren Namenskonventionen, Sie können dies tun:
- eine gespeicherte Prozedur erstellen, die einen Sequenznamen, Tabellennamen akzeptiert, Spaltennamen als Parameter.
- Das Verfahren wird die angegebene Tabelle/Spalte für max Wert
- Das Verfahren wird dann noch gesehen Abfrage der Zuwachs durch Anpassungen über
- nun einen Wrapper gespeicherte Prozedur generiert, die der Arbeiter Prozedur vorbei in den drei Werten nennen.
End Ergebnis sollte sein:
BEGIN
reset_seq_val ('seq1', 'table1', 'col1');
reset_seq_val ('seq2', 'table2', 'col2');
...
END;
Die hier harte Arbeit wird diese Liste kompilieren, aber einmal erledigt, sollten Sie wiederverwenden es On-Demand können.
Mögliches Duplikat von [Die beste Methode, um eine Oracle-Sequenz auf den nächsten Wert in einer vorhandenen Spalte zurückzusetzen?] (Http://stackoverflow.com/questions/6099108/best-way-to-reset-an-oracle-sequence) -zum-nächsten-Wert-in-einer-bestehenden-Spalte) – OldProgrammer
Um Ihre Frage möglicherweise neu zu formulieren, befinden Sie sich in einer Testumgebung und Sie haben gerade neue Daten aus der Produktion geladen und Ihre Sequenzen sind nun in der Testumgebung Hinter den Schlüsselwerten in den Daten müssen Sie also die Testumgebungssequenzen hochsetzen, damit sie Werte oberhalb der gerade geladenen Daten generieren.(Wütend). Folgen Sie dem Link @OldProgrammer zur Verfügung gestellt, wie es den Weg zeigt, und Sie sollten in der Lage sein, alle Ihre Sequenz programmgesteuert zu machen. – unleashed