Copier les valeurs d'une séquence à partir d'une base de données Oracle à l'autre
Est-il possible de copier les valeurs actuelles des séquences dans un schéma de base de données? Les séquences ont déjà été créés dans les deux bases de données. C'est dans Oracle.
Edit:
Basé sur la ci-dessous, une fois le lien de base de données est mis en place, ce script sera assurez-vous que la base de données cible de la séquence de valeurs sont supérieures ou égales à la base de données source des valeurs. La motivation pour cela est que nous n'avons pas de clé primaire erreurs après la copie de données, donc le fait que le nombre de personnes visées ne sont pas exacte n'est pas un problème.
set serveroutput on
DECLARE
CURSOR GetCursorsToSync
is
SELECT a.sequence_name, a.last_number last_number_a, b.last_number last_number_b
FROM user_sequences@SOURCE_DB a, user_sequences b
where a.sequence_name = b.sequence_name
and a.last_number != b.last_number;
type CursorsTableType is table of GetCursorsToSync%rowtype index by pls_integer;
CursorsTable CursorsTableType;
i pls_integer;
PROCEDURE reset_sequence(
sequence_name IN VARCHAR2,
source_value IN NUMBER,
target_value IN NUMBER )
IS
l_sql varchar2(4000);
l_temp number(30);
BEGIN
IF source_value <= target_value THEN
RETURN;
END IF;
dbms_output.put_line(sequence_name || ' ' || source_value || ' ' || target_value);
l_sql := 'alter sequence '|| sequence_name || ' increment by '||to_char(source_value-target_value);
dbms_output.put_line(l_sql);
EXECUTE immediate l_sql;
l_sql := 'SELECT '|| sequence_name || '.nextval FROM dual';
dbms_output.put_line(l_sql);
EXECUTE immediate l_sql into l_temp;
dbms_output.put_line(l_temp);
l_sql := 'alter sequence '|| sequence_name || ' increment by 1';
dbms_output.put_line(l_sql);
EXECUTE immediate l_sql;
COMMIT;
END reset_sequence;
BEGIN
open GetCursorsToSync;
fetch GetCursorsToSync bulk collect into CursorsTable;
close GetCursorsToSync;
commit;
i := CursorsTable.first;
while i is not null loop
reset_sequence(CursorsTable(i).sequence_name,
CursorsTable(i).last_number_a,CursorsTable(i).last_number_b);
i := CursorsTable.next(i);
end loop;
end;
/
Il pourrait être utile de réfléchir à l'aide de la db_link) et les séquences dans la cible db dans votre base de données source des processus, plutôt que d'avoir les mêmes séquences dans les deux bases de données.
C'est fondamentalement l'ensemencement des données à partir d'une base de données dans un autre, donc je ne veux pas être connectés après ce processus.
C'est fondamentalement l'ensemencement des données à partir d'une base de données dans un autre, donc je ne veux pas être connectés après ce processus.
OriginalL'auteur Greg Reynolds | 2011-06-21
Vous devez vous connecter pour publier un commentaire.
Une combinaison de UltraCommits états et d'un lien de base de données, en plus d'une procédure stockée qui permet de planifier automatiquement, serait bien vous servir.
Ça a l'air bon, merci. Alors je suppose que je peux l'envelopper dans une procédure afin d'obtenir toutes les séquences dans mon schéma et de les transférer.
J'ai édité ma question afin d'incorporer ma procédure basée sur votre suggestion. Merci encore une fois.
OriginalL'auteur Joel Slowik
Question: Comment pouvons-nous définir la LASTVALUE valeur dans une Séquence Oracle?
Réponse: Vous pouvez modifier le LASTVALUE pour une séquence Oracle, par l'exécution d'une instruction ALTER
Commande de la SÉQUENCE.
Par exemple, si la dernière valeur utilisée par l'Oracle de la séquence est de 100 et que vous souhaitez réinitialiser la séquence de servir 225 comme la valeur suivante. Vous pouvez exécuter les commandes suivantes.
Maintenant, la prochaine valeur à être servi par la séquence est 225.
Peut-on supposer l'existence d'un lien de base de données entre les bases de données?
OriginalL'auteur UltraCommit
J'ai rencontré l'erreur suivante lors de la tentative d'exécution d'un script basé sur celui fourni par M. Reynold:
ORA-04013: nombre de CACHE doit être inférieure à un cycle.
Cause: nombre de CACHE de donnée est plus grande que les valeurs dans un cycle.
Action: agrandir le cycle, ou le cache de moins en moins de valeurs.
Cette erreur se produit si le courant nextval est trop grande pour permettre le nombre spécifié de valeurs mises en cache dans le cycle actuel. En conséquence, j'ai inclus une version mise à jour de son scénario dans lequel la séquence cible est d'abord modifiée avec le "NOCACHE" option, puis le cache est restauré à sa valeur d'origine après la cible nextval a été mis à jour. Dans mon exemple, le db-link et alias "PD" se réfère à la base de données source et de l'assurance qualité se réfère à la base de données cible.
J'espère que ce sera aussi utile à quelqu'un d'autre que la solution précédente était pour moi.
OriginalL'auteur user3403231
OriginalL'auteur Fernando Galves