La Web del Programador: Comunidad de Programadores
 
    Pregunta:  64168 - ORACLE SINCRONIZACION DE STORED PROCEDURE
Autor:  Rosa C
Tengo un problema. Resulta que tengo un stored procedure encargado de realizar varias transacciones en muchas tablas. Es un procedimiento relativamente duradero ya que hay diferentes trigger que se ejecutan al momento de realizar operaciones en las tablas y cosas como esas. Entonces, ya que la primera operacion que se realiza dentro de este procedimiento, es un select a un tabla para incrementar el consecutivo del registro. Este valor que se incrementa se comienza a ingresar en todos los registros de las otras tablas.

El error es que hay ocasiones en dos usuarios acceden al procedimiento casi al mismo tiempo por lo que el valor que leen para el consecutivo es el mismo, al final de todas las transacciones, solo uno de los dos registros es insertado y el otro me genera un error de llave primaria violada.

Necesito saber si hay una forma de bloquear la lectura de un campo de la tabla y liberarlo hasta que el procedimiento finalice y despues que entre la siguiente peticion al procedimiento, o bien si esta misma operación se puede realizar sincronizando las llamadas al stored procedure.

  Respuesta:  Antonio Reyes Borges
En estos casos siempre uso una secuencia:
CREATE SEQUENCE val ; -- Val es el nombre de la secuencia.
-- Luego s'olo tienes que hacer una consulta al NEXTVAL de la secuencia
SELECT VAL.NEXTVAL INTO x FROM DUAL ;
-- x es una variable tipo numérica, de esta manera,
-- por mucho que coincidan dos usuarios en solicitar un valor,
-- siempre oracle le entragará uno diferente a cada usuario