Selvom jeg stærkt vil anbefale det (foretrækker at bruge en enkelt sekvens og bare acceptere, at der vil være større huller end forventet), kan du bygge din egen pseudo-sekvenstabel
CREATE TABLE my_sequences (
sequence_name VARCHAR2(30) PRIMARY KEY,
sequence_val NUMBER
);
indsæt et par rækker
INSERT INTO my_sequences( sequence_name, sequence_val )
VALUES( 'GroupA', 1 );
INSERT INTO my_sequences( sequence_name, sequence_val )
VALUES( 'GroupB', 1 );
og skriv derefter en funktion for at få den næste sekvensværdi
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;
Dette vil låse rækken i tabellen for den bestemte sekvens, indtil transaktionen, der hentede den næste række, enten forpligtes eller ruller tilbage. Dette vil radikalt reducere skalerbarheden af din applikation sammenlignet med at bruge Oracle-sekvenser ved at sikre, at kun én session kan indsætte en række for et bestemt group_name
ad gangen - de andre vil blokere for at vente på sekvensen. Hvis du har et system med et relativt lille antal samtidige brugere (eller et relativt stort antal group_name
værdier), som kan være acceptable for dig. Men generelt er det en dårlig praksis. Afhængigt af Oracle-versionen kan du muligvis bruge autonome transaktioner til at øge samtidigheden, men det tilføjer blot endnu en smule kompleksitet til løsningen. På det tidspunkt, hvor du virkelig er bekymret for skalerbarhed, vil du virkelig gerne skubbe hele designet tilbage og bare bruge en Oracle-sekvens.