Även om jag starkt skulle rekommendera det (föredrar att använda en enstaka sekvens och bara acceptera att det blir större luckor än förväntat), kan du bygga din egen pseudosekvenstabell
CREATE TABLE my_sequences (
sequence_name VARCHAR2(30) PRIMARY KEY,
sequence_val NUMBER
);
infoga ett par rader
INSERT INTO my_sequences( sequence_name, sequence_val )
VALUES( 'GroupA', 1 );
INSERT INTO my_sequences( sequence_name, sequence_val )
VALUES( 'GroupB', 1 );
och skriv sedan en funktion för att få nästa sekvensvärde
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;
Detta kommer att låsa raden i tabellen för den specifika sekvensen tills transaktionen som hämtade nästa rad antingen commits eller rullar tillbaka. Detta kommer att radikalt minska skalbarheten för din applikation jämfört med att använda Oracle-sekvenser genom att säkerställa att endast en session kan infoga en rad för ett visst group_name
åt gången - de andra blockerar i väntan på sekvensen. Om du har ett system med ett relativt litet antal samtidiga användare (eller ett relativt stort antal group_name
värden), som kan vara acceptabla för dig. Men i allmänhet är det en dålig praxis. Beroende på Oracle-versionen kan du kanske använda autonoma transaktioner för att öka samtidigheten, men det ger bara ytterligare en bit av komplexiteten till lösningen. När du verkligen är orolig för skalbarhet, skulle du verkligen vilja trycka tillbaka på hela designen och bara använda en Oracle-sekvens.