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

Usar secuencias correctamente

Estas en el tema de Usar secuencias correctamente en el foro de Oracle en Foros del Web. Buenas....estoy empezando a utilizar secuencias en oracle. Iniclamente lo que hacia era hallar el valor maxio y añadirle una unidad para obtener el nuevo valor ...
  #1 (permalink)  
Antiguo 22/05/2009, 23:38
 
Fecha de Ingreso: mayo-2009
Mensajes: 14
Antigüedad: 15 años, 6 meses
Puntos: 1
Sonrisa Usar secuencias correctamente

Buenas....estoy empezando a utilizar secuencias en oracle. Iniclamente lo que hacia era hallar el valor maxio y añadirle una unidad para obtener el nuevo valor para un campo que funcionaria como un autonumerico, pero como he leido que podria tener problemas con las concurrencias decidi empezar leyendo algo de concurrencias.

Código:
CREATE SEQUENCE SEQ_Sistema_IdSistema
	INCREMENT BY 1
	START WITH 1;
Lo bueno es que obtengo el valor correlativo solo ejecutando algo como lo siguiente:

Código:
SELECT SEQ_Sistema_IdSistema.NEXTVAL 
FROM DUAL;
Pero.. mi pregunta es la siguiente...

Al colocar la logica correspondiente en el ingreso de unregistro, que pasara con el valor que me devuelve NEXVAL en caso de que salte una excepcion.ES decir, si lo uso en un procedimiento almacenado, y alli me salta un error, el valor del NEXTVAL aumentara de todas formas...esto podria prococar algunos huecos ...

Bueno... gracias de antemano por las respuestas y comentarios brindados.
Saludos.
  #2 (permalink)  
Antiguo 23/05/2009, 19:02
Avatar de kikolice  
Fecha de Ingreso: marzo-2004
Mensajes: 1.510
Antigüedad: 20 años, 8 meses
Puntos: 7
Respuesta: Usar secuencias correctamente

si no mal recuerdo, el simple uso del nextval incrementa el valor de la secuencia, por lo que si dentro del proceso ocurre un error y al final no se utiliza el numero de la secuencia ese numero se perdera, si te es estrictamente necesario mantener los numeros consecutivos "sin huecos" deja tus procesos como estan y utiliza el FOR UPDATE OF en el select del max + 1 para bloquear el acceso hasta que no termine el proceso y evitar problemas de concurrencia
__________________
Blogzote.com :-) Mi blog
  #3 (permalink)  
Antiguo 28/05/2009, 18:32
 
Fecha de Ingreso: abril-2006
Mensajes: 62
Antigüedad: 18 años, 7 meses
Puntos: 0
Respuesta: Usar secuencias correctamente

Es correcto lo que decís para el caso de las excepciones. Si es un requisito indispensable que los números asignados no tengan brechas una solución que podés implementar es llevar tus secuencias en una tabla propia y utilizar una función para que ocupe el lugar del nextval.

Es algo así la solución que se le da en Oracle EBS.

Si te interesan más detalles de esta alternativa avisá y te posteo un ejemplo.

Siempre que puedan admitirse brechas es preferente usar las secuencias de base, así es que antes de ir por la solución de la tabla propia deberías considerar si es realmente indispensable.
__________________
Guish
  #4 (permalink)  
Antiguo 01/06/2009, 18:29
Avatar de kikolice  
Fecha de Ingreso: marzo-2004
Mensajes: 1.510
Antigüedad: 20 años, 8 meses
Puntos: 7
Respuesta: Usar secuencias correctamente

Cita:
Iniciado por Guish Ver Mensaje
Es correcto lo que decís para el caso de las excepciones. Si es un requisito indispensable que los números asignados no tengan brechas una solución que podés implementar es llevar tus secuencias en una tabla propia y utilizar una función para que ocupe el lugar del nextval.

Es algo así la solución que se le da en Oracle EBS.

Si te interesan más detalles de esta alternativa avisá y te posteo un ejemplo.

Siempre que puedan admitirse brechas es preferente usar las secuencias de base, así es que antes de ir por la solución de la tabla propia deberías considerar si es realmente indispensable.
no recuerdo exactamente como lo hace la ebs pero a fin de cuentas seguro debera de hacer un select for update of para evitar problemas de concurrencia
__________________
Blogzote.com :-) Mi blog
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 10:40.