Oracle
 sql >> Baza danych >  >> RDS >> Oracle

oracle - sekwencje bez sekwencji

Chociaż zdecydowanie odradzałbym to (wolę używać pojedynczej sekwencji i po prostu zaakceptować, że będą większe niż oczekiwano odstępy), możesz zbudować własną tabelę pseudosekwencji

CREATE TABLE my_sequences (
  sequence_name VARCHAR2(30) PRIMARY KEY,
  sequence_val  NUMBER
);

wstaw kilka wierszy

INSERT INTO my_sequences( sequence_name, sequence_val )
  VALUES( 'GroupA', 1 );
INSERT INTO my_sequences( sequence_name, sequence_val )
  VALUES( 'GroupB', 1 );

a następnie napisz funkcję, aby uzyskać następną wartość sekwencji

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;

Spowoduje to zablokowanie wiersza w tabeli dla określonej sekwencji, dopóki transakcja, która pobrała następny wiersz, zostanie zatwierdzona lub wycofana. To radykalnie zmniejszy skalowalność aplikacji w porównaniu do korzystania z sekwencji Oracle, zapewniając, że tylko jedna sesja może wstawiać wiersz dla określonej group_name na raz - inne będą blokować oczekiwanie na sekwencję. Jeśli masz system ze stosunkowo małą liczbą jednoczesnych użytkowników (lub stosunkowo dużą liczbą group_name wartości), które mogą być dla Ciebie do zaakceptowania. Ale generalnie jest to kiepska praktyka. W zależności od wersji Oracle możesz używać transakcji autonomicznych w celu zwiększenia współbieżności, ale to tylko dodaje trochę złożoności do rozwiązania. W momencie, w którym naprawdę martwisz się skalowalnością, naprawdę chciałbyś odepchnąć cały projekt i po prostu użyć sekwencji Oracle.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Próba stworzenia listy wartości zawierającej wartość z tabeli i liczby pod nią

  2. Zwróć instrukcję SQL wyraźnego kursora

  3. Zapytanie aktualizujące Oracle SQL aktualizuje wartości tylko wtedy, gdy są one puste

  4. Użyj tnsnames.ora w Oracle SQL Developer

  5. Jak tworzyć procedury składowane PL/SQL z parametrami w bazie danych Oracle