Oracle
 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;

Това ще заключи реда в таблицата за конкретната последователност, докато транзакцията, която извлече следващия ред, или се ангажира, или се върне назад. Това радикално ще намали мащабируемостта на вашето приложение в сравнение с използването на последователности на Oracle, като гарантира, че само една сесия може да вмъква ред за определен group_name в даден момент-- другите ще блокират в очакване на последователността. Ако имате система с относително малък брой едновременни потребители (или относително голям брой group_name стойности), които може да са приемливи за вас. Но като цяло това е лоша практика. В зависимост от версията на Oracle може да сте в състояние да използвате автономни транзакции, за да увеличите паралелността, но това само добавя още малко сложност към решението. В момента, в който наистина се притеснявате за мащабируемостта, наистина бихте искали да се откажете от целия дизайн и просто да използвате последователност на 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. Форматиране на изход на заявки в SQLPlus

  2. как да извикам един съхранен процес от прашник и да модифицирам рекурсора, който се връща?

  3. вътрешно присъединяване с група по израз в oracle sql

  4. Oracle SQL автоматично създава VARCHAR инкрементиран PK

  5. Как да напиша параметризирана заявка за вмъкване на оракул?