Hoewel ik het ten zeerste zou afraden (gebruik liever een enkele reeks en accepteer gewoon dat er grotere hiaten zullen zijn dan verwacht), kunt u uw eigen pseudo-reekstabel maken
CREATE TABLE my_sequences (
sequence_name VARCHAR2(30) PRIMARY KEY,
sequence_val NUMBER
);
voeg een paar rijen in
INSERT INTO my_sequences( sequence_name, sequence_val )
VALUES( 'GroupA', 1 );
INSERT INTO my_sequences( sequence_name, sequence_val )
VALUES( 'GroupB', 1 );
en schrijf dan een functie om de volgende reekswaarde te krijgen
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;
Dit vergrendelt de rij in de tabel voor de specifieke reeks totdat de transactie die de volgende rij heeft opgehaald, zich commit of terugdraait. Dit zal de schaalbaarheid van uw applicatie radicaal verminderen in vergelijking met het gebruik van Oracle-reeksen door ervoor te zorgen dat slechts één sessie een rij kan invoegen voor een bepaalde group_name
tegelijk-- de anderen blokkeren het wachten op de reeks. Als u een systeem heeft met een relatief klein aantal gelijktijdige gebruikers (of een relatief groot aantal group_name
waarden), die voor u acceptabel kunnen zijn. Maar over het algemeen is het een slechte gewoonte. Afhankelijk van de Oracle-versie kunt u mogelijk autonome transacties gebruiken om de gelijktijdigheid te vergroten, maar dat maakt de oplossing alleen maar ingewikkelder. Op het moment dat je je echt zorgen maakt over schaalbaarheid, zou je echt terug willen dringen op het hele ontwerp en gewoon een Oracle-reeks gebruiken.