Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Duda con SEQUENCE

Estas en el tema de Duda con SEQUENCE en el foro de Oracle en Foros del Web. Hola Tengo una tabla llamada conceptos que tiene una llave primaria compuesta: id_of id_con id_of es una llave foránea proveniente de una tabla llamada ofertas. ...
  #1 (permalink)  
Antiguo 10/03/2012, 00:23
 
Fecha de Ingreso: mayo-2010
Mensajes: 93
Antigüedad: 13 años, 10 meses
Puntos: 0
Duda con SEQUENCE

Hola

Tengo una tabla llamada conceptos que tiene una llave primaria compuesta:

id_of
id_con

id_of es una llave foránea proveniente de una tabla llamada ofertas. (la relación es 1 oferta para muchos conceptos)

Suponiendo que id_of= GIA-018-A-12 e id_con = 001 entonces mi clave de concepto sería: GIA-018-A-12001. Si yo decidiera agregar otro concepto a esa oferta entonces la segunda clave de mi concepto quisiera que fuese GIA-018-A-12002, la tercero GIA-018-A-12003 y así sucesivamente.

El comando SEQUENCE me permite ir haciendo incrementos pero yo quisiera que si id_of, se reinicie id_con, entonces la cuenta de id_con se reiniciara.

Lo que hasta ahora tengo es lo sigueinte:


CREATE SEQUENCE CONCEPTOS_ID_CON_SEQ
MINVALUE 1
CYCLE
NOCACHE
ORDER ;

Pero no veo como especificarle que cambie si id_of cambia.

Soy apenas novato en esto y me gustaría que pudieran ayudarme. Les estaré muy agradecidos

Saludos y muchas gracias
  #2 (permalink)  
Antiguo 20/03/2012, 17:47
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 5 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
  #3 (permalink)  
Antiguo 21/03/2012, 09:19
 
Fecha de Ingreso: mayo-2010
Mensajes: 93
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Duda con SEQUENCE

muchas gracias por tú respuesta matanga, aunque no soy un experto está muy entendible... gracias.

De cualquier manera quiero comentarte que yo estaba en un error al pretender eso (soy tan novato jejejeje) y ya recibí la orientación de otra persona con más experiencia.

Muchas gracias y ojalá sigas ayudando a mucha gente de esta manera.

Etiquetas: tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:45.