Aunque recomendaría encarecidamente que no lo haga (prefiero usar una sola secuencia y simplemente aceptar que habrá espacios más grandes de lo esperado), puede crear su propia tabla de pseudosecuencia
CREATE TABLE my_sequences (
sequence_name VARCHAR2(30) PRIMARY KEY,
sequence_val NUMBER
);
inserta un par de filas
INSERT INTO my_sequences( sequence_name, sequence_val )
VALUES( 'GroupA', 1 );
INSERT INTO my_sequences( sequence_name, sequence_val )
VALUES( 'GroupB', 1 );
y luego escribe una función para obtener el siguiente valor de secuencia
CREATE FUNCTION get_nextval( p_sequence_name IN VARCHAR2 )
RETURN NUMBER
IS
l_val NUMBER;
BEGIN
SELECT sequence_val
INTO l_val
FROM my_sequences
WHERE sequence_name = p_sequence_name
FOR UPDATE;
UPDATE my_sequences
SET sequence_val = sequence_val + 1
WHERE sequence_name = p_sequence_name;
RETURN l_val;
END;
Esto bloqueará la fila en la tabla para la secuencia particular hasta que la transacción que recuperó la siguiente fila se confirme o revierta. Esto disminuirá radicalmente la escalabilidad de su aplicación en comparación con el uso de secuencias de Oracle al garantizar que solo una sesión pueda insertar una fila para un group_name
en particular. a la vez-- los demás bloquearán esperando la secuencia. Si tiene un sistema con una cantidad relativamente pequeña de usuarios simultáneos (o una cantidad relativamente grande de group_name
valores), que pueden ser aceptables para usted. Pero en general es una mala práctica. Dependiendo de la versión de Oracle, es posible que pueda usar transacciones autónomas para aumentar la concurrencia, pero eso solo agrega un poco más de complejidad a la solución. En el momento en que esté realmente preocupado por la escalabilidad, realmente querrá retroceder en todo el diseño y simplemente usar una secuencia de Oracle.