Chociaż zdecydowanie odradzałbym to (wolę używać pojedynczej sekwencji i po prostu zaakceptować, że będą większe niż oczekiwano odstępy), możesz zbudować własną tabelę pseudosekwencji
CREATE TABLE my_sequences (
sequence_name VARCHAR2(30) PRIMARY KEY,
sequence_val NUMBER
);
wstaw kilka wierszy
INSERT INTO my_sequences( sequence_name, sequence_val )
VALUES( 'GroupA', 1 );
INSERT INTO my_sequences( sequence_name, sequence_val )
VALUES( 'GroupB', 1 );
a następnie napisz funkcję, aby uzyskać następną wartość sekwencji
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;
Spowoduje to zablokowanie wiersza w tabeli dla określonej sekwencji, dopóki transakcja, która pobrała następny wiersz, zostanie zatwierdzona lub wycofana. To radykalnie zmniejszy skalowalność aplikacji w porównaniu do korzystania z sekwencji Oracle, zapewniając, że tylko jedna sesja może wstawiać wiersz dla określonej group_name
na raz - inne będą blokować oczekiwanie na sekwencję. Jeśli masz system ze stosunkowo małą liczbą jednoczesnych użytkowników (lub stosunkowo dużą liczbą group_name
wartości), które mogą być dla Ciebie do zaakceptowania. Ale generalnie jest to kiepska praktyka. W zależności od wersji Oracle możesz używać transakcji autonomicznych w celu zwiększenia współbieżności, ale to tylko dodaje trochę złożoności do rozwiązania. W momencie, w którym naprawdę martwisz się skalowalnością, naprawdę chciałbyś odepchnąć cały projekt i po prostu użyć sekwencji Oracle.