Meskipun saya sangat menyarankan untuk tidak melakukannya (lebih suka menggunakan satu urutan dan hanya menerima bahwa akan ada kesenjangan yang lebih besar dari yang diharapkan), Anda dapat membuat tabel urutan semu Anda sendiri
CREATE TABLE my_sequences (
sequence_name VARCHAR2(30) PRIMARY KEY,
sequence_val NUMBER
);
menyisipkan beberapa baris
INSERT INTO my_sequences( sequence_name, sequence_val )
VALUES( 'GroupA', 1 );
INSERT INTO my_sequences( sequence_name, sequence_val )
VALUES( 'GroupB', 1 );
dan kemudian tulis fungsi untuk mendapatkan nilai urutan berikutnya
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;
Ini akan mengunci baris dalam tabel untuk urutan tertentu hingga transaksi yang mengambil baris berikutnya melakukan atau memutar kembali. Ini secara radikal akan mengurangi skalabilitas aplikasi Anda dibandingkan dengan menggunakan urutan Oracle dengan memastikan bahwa hanya satu sesi yang dapat menyisipkan baris untuk group_name
tertentu pada suatu waktu-- yang lain akan memblokir menunggu urutan. Jika Anda memiliki sistem dengan jumlah pengguna bersamaan yang relatif kecil (atau jumlah group_name
yang relatif besar nilai), yang mungkin dapat Anda terima. Tetapi secara umum itu adalah praktik yang buruk. Bergantung pada versi Oracle, Anda mungkin dapat menggunakan transaksi otonom untuk meningkatkan konkurensi tetapi itu hanya menambah sedikit kerumitan pada solusi. Pada saat Anda benar-benar khawatir tentang skalabilitas, Anda benar-benar ingin mendorong kembali seluruh desain dan hanya menggunakan urutan Oracle.