Ačkoli bych to důrazně nedoporučoval (upřednostňuji používat jednu sekvenci a pouze akceptovat, že budou větší než očekávané mezery), můžete si vytvořit svou vlastní tabulku pseudosekvencí
CREATE TABLE my_sequences (
sequence_name VARCHAR2(30) PRIMARY KEY,
sequence_val NUMBER
);
vložte několik řádků
INSERT INTO my_sequences( sequence_name, sequence_val )
VALUES( 'GroupA', 1 );
INSERT INTO my_sequences( sequence_name, sequence_val )
VALUES( 'GroupB', 1 );
a poté napište funkci pro získání hodnoty další sekvence
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;
Tím se uzamkne řádek v tabulce pro konkrétní sekvenci, dokud se transakce, která načetla další řádek, buď nepotvrdí, nebo se vrátí zpět. To radikálně sníží škálovatelnost vaší aplikace ve srovnání s používáním sekvencí Oracle tím, že zajistí, že pouze jedna relace může vložit řádek pro konkrétní group_name
najednou-- ostatní zablokují čekání na sekvenci. Pokud máte systém s relativně malým počtem souběžných uživatelů (nebo relativně velkým počtem group_name
hodnoty), které pro vás mohou být přijatelné. Ale obecně je to špatná praxe. V závislosti na verzi Oracle můžete být schopni použít autonomní transakce ke zvýšení souběžnosti, ale to jen přidává další trochu složitosti řešení. V okamžiku, kdy se skutečně obáváte o škálovatelnost, byste opravdu chtěli celý návrh vrátit zpět a použít pouze sekvenci Oracle.