Въпреки че силно бих препоръчал да не го правите (предпочитате да използвате една последователност и просто да приемете, че ще има по-големи от очакваните пропуски), можете да създадете своя собствена таблица с псевдопоследователности
CREATE TABLE my_sequences (
sequence_name VARCHAR2(30) PRIMARY KEY,
sequence_val NUMBER
);
вмъкнете няколко реда
INSERT INTO my_sequences( sequence_name, sequence_val )
VALUES( 'GroupA', 1 );
INSERT INTO my_sequences( sequence_name, sequence_val )
VALUES( 'GroupB', 1 );
и след това напишете функция за получаване на следващата стойност на последователност
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;
Това ще заключи реда в таблицата за конкретната последователност, докато транзакцията, която извлече следващия ред, или се ангажира, или се върне назад. Това радикално ще намали мащабируемостта на вашето приложение в сравнение с използването на последователности на Oracle, като гарантира, че само една сесия може да вмъква ред за определен group_name
в даден момент-- другите ще блокират в очакване на последователността. Ако имате система с относително малък брой едновременни потребители (или относително голям брой group_name
стойности), които може да са приемливи за вас. Но като цяло това е лоша практика. В зависимост от версията на Oracle може да сте в състояние да използвате автономни транзакции, за да увеличите паралелността, но това само добавя още малко сложност към решението. В момента, в който наистина се притеснявате за мащабируемостта, наистина бихте искали да се откажете от целия дизайн и просто да използвате последователност на Oracle.