強くお勧めしますが(単一のシーケンスを使用し、予想よりも大きなギャップがあることを受け入れることをお勧めします)、独自の疑似シーケンステーブルを作成できます
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;
これにより、次の行を取得したトランザクションがコミットまたはロールバックするまで、特定のシーケンスのテーブル内の行がロックされます。これにより、特定のgroup_name
の行を挿入できるセッションが1つだけになるようにすることで、Oracleシーケンスを使用する場合と比較して、アプリケーションのスケーラビリティが大幅に低下します。 一度に-他の人はシーケンスの待機をブロックします。同時ユーザー数が比較的少ない(またはgroup_name
が比較的多い)システムの場合 値)、それはあなたに受け入れられるかもしれません。しかし、一般的にそれは悪い習慣です。 Oracleのバージョンによっては、自律型トランザクションを使用して同時実行性を高めることができる場合がありますが、それによってソリューションが少し複雑になります。スケーラビリティについて本当に心配している時点で、設計全体を押し戻して、Oracleシーケンスを使用することをお勧めします。