sql >> Databáze >  >> RDS >> Oracle

oracle - sekvence bez sekvence

Ačkoli bych to důrazně nedoporučoval (upřednostňuji používat jednu sekvenci a pouze akceptovat, že budou větší než očekávané mezery), můžete si vytvořit svou vlastní tabulku pseudosekvencí

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

vložte několik řádků

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

a poté napište funkci pro získání hodnoty další sekvence

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;

Tím se uzamkne řádek v tabulce pro konkrétní sekvenci, dokud se transakce, která načetla další řádek, buď nepotvrdí, nebo se vrátí zpět. To radikálně sníží škálovatelnost vaší aplikace ve srovnání s používáním sekvencí Oracle tím, že zajistí, že pouze jedna relace může vložit řádek pro konkrétní group_name najednou-- ostatní zablokují čekání na sekvenci. Pokud máte systém s relativně malým počtem souběžných uživatelů (nebo relativně velkým počtem group_name hodnoty), které pro vás mohou být přijatelné. Ale obecně je to špatná praxe. V závislosti na verzi Oracle můžete být schopni použít autonomní transakce ke zvýšení souběžnosti, ale to jen přidává další trochu složitosti řešení. V okamžiku, kdy se skutečně obáváte o škálovatelnost, byste opravdu chtěli celý návrh vrátit zpět a použít pouze sekvenci Oracle.



  1. Pochopení skupiny dostupnosti Always ON mezi instancemi SQL Serveru na bázi Linuxu. Část 1

  2. Použití propojení databáze Oracle bez nečitelných dynamických SQL

  3. Implementace databáze nejsledovanějších prvků

  4. Proč se mi zobrazuje tato chyba? Do „VALUE.VALUE_TX“ nelze vložit hodnotu null