sql >> Base de Datos >  >> RDS >> Oracle

oráculo - secuencias sin secuencia

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.