Saltar al contenido

¿Cómo crear una secuencia de Oracle comenzando con el valor máximo de una tabla?

Solución:

Si puede usar PL / SQL, intente (EDITAR: Incorpora la sugerencia xlnt de Neil para comenzar en el siguiente valor más alto):

SELECT 'CREATE SEQUENCE transaction_sequence MINVALUE 0 START WITH '||MAX(trans_seq_no)+1||' INCREMENT BY 1 CACHE 20'
  INTO v_sql
  FROM transaction_log;

EXECUTE IMMEDIATE v_sql;

Otro punto a considerar: si configura el parámetro CACHE en 20, corre el riesgo de perder hasta 19 valores en su secuencia si la base de datos deja de funcionar. Los valores de CACHEd se pierden al reiniciar la base de datos. A menos que esté presionando la secuencia con mucha frecuencia, o no le importen mucho los espacios, lo establecería en 1.

Un detalle final: los valores que especificó para CACHE e INCREMENT BY son los predeterminados. Puede dejarlos apagados y obtener el mismo resultado.

Aquí tengo mi ejemplo que funciona bien:

declare
 ex number;
begin
  select MAX(MAX_FK_ID)  + 1 into ex from TABLE;
  If ex > 0 then
    begin
            execute immediate 'DROP SEQUENCE SQ_NAME';
      exception when others then
        null;
    end;
    execute immediate 'CREATE SEQUENCE SQ_NAME INCREMENT BY 1 START WITH ' || ex || ' NOCYCLE CACHE 20 NOORDER';
  end if;
end;

es posible que desee comenzar con max(trans_seq_no) + 1.

mirar:

SQL> create table my_numbers(my_number number not null primary key);

Table created.

SQL> insert into my_numbers(select rownum from user_objects);

260 rows created.

SQL> select max(my_number) from my_numbers;

MAX(MY_NUMBER)
--------------
           260

SQL> create sequence my_number_sn start with 260;

Sequence created.

SQL> insert into my_numbers(my_number) values (my_number_sn.NEXTVAL);
insert into my_numbers(my_number) values (my_number_sn.NEXTVAL)
*
ERROR at line 1:
ORA-00001: unique constraint (NEIL.SYS_C00102439) violated

Cuando crea una secuencia con un número, debe recordar que la primera vez que seleccione contra la secuencia, Oracle devolverá el valor inicial que le asignó.

SQL> drop sequence my_number_sn;

Sequence dropped.

SQL> create sequence my_number_sn start with 261;

Sequence created.

SQL>  insert into my_numbers(my_number) values (my_number_sn.NEXTVAL);

1 row created.

Si está tratando de hacer lo ‘sin pausas’, le recomiendo encarecidamente que

No lo hago y no utilizo una secuencia para ello.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *