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.

OriginalL'auteur Greg Reynolds | 2011-06-21