sql >> データベース >  >> RDS >> Oracle

oracle-シーケンスのないシーケンス

    強くお勧めしますが(単一のシーケンスを使用し、予想よりも大きなギャップがあることを受け入れることをお勧めします)、独自の疑似シーケンステーブルを作成できます

    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シーケンスを使用することをお勧めします。



    1. リンクされたテーブルのリストをAccess2016からExcelにエクスポートする方法

    2. mySQL繰り返しイベントクエリ

    3. 欠落しているエントリを含む15分ごとのGROUPBYタイムスタンプ

    4. SQL左結合