Ver Mensaje Individual
  #2 (permalink)  
Antiguo 20/03/2012, 17:47
Avatar de matanga
matanga
 
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 6 meses
Puntos: 85
Respuesta: Duda con SEQUENCE

Esto no lo puedes resolver con una SEQUENCE, si quieres que el valor de id_con sea correlativo y además se reinicie en función del valor de id_of, entonces tendrás que desarrollar tu propio control de secuencias, por ejemplo:

Código:
create table conceptos(
 id_of varchar2(20),
 id_con varchar2(20)
 );

--tabla seq guarda las secuencias
--para cada id_oferta
create table seq(
 seq_name varchar2(20),
 seq_value number(8)
);

--función para obtener la sequencia
--de cada id_oferta
create or replace function
 next_val (sequence_name varchar2)
 return number
as
 valor number(8);
 existe number(8);
begin
 select count(*) into existe
 from seq
 where seq_name = sequence_name;
 if (existe = 0) then
  insert into seq values (sequence_name,0);
 end if;
 update seq
 set seq_value = seq_value + 1
 where seq_name = sequence_name
 returning seq_value into valor;
 return valor;
end;
/

--insertar algunos valores
insert into conceptos values
('GIA-018-A-12', next_val('GIA-018-A-12') );
insert into conceptos values
('GIA-018-A-12', next_val('GIA-018-A-12') );
insert into conceptos values
('GIA-018-A-13', next_val('GIA-018-A-13') );

--resultado
select * from conceptos;

ID_OF                ID_CON
-------------------- --------------------
GIA-018-A-12         1
GIA-018-A-12         2
GIA-018-A-13         1

--reiniciar la secuencia de un id_oferta
update seq set seq_value = 0
where seq_name = 'GIA-018-A-12';
Pero debes considerar los posibles problemas de rendimiento en entornos de alta concurrencia, ya que el bloqueo sobre la tabla seq hace que los insert sobre la tabla conceptos se resuelvan uno por vez, por lo que solo deberías implementar este tipo de solución cuando los valores de la secuencia son parte de los requerimientos del sistema y no una cuestión estética.

Saludos