sql >> Databasteknik >  >> RDS >> Oracle

orakel - sekvenser utan sekvens

Även om jag starkt skulle rekommendera det (föredrar att använda en enstaka sekvens och bara acceptera att det blir större luckor än förväntat), kan du bygga din egen pseudosekvenstabell

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

infoga ett par rader

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

och skriv sedan en funktion för att få nästa sekvensvärde

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;

Detta kommer att låsa raden i tabellen för den specifika sekvensen tills transaktionen som hämtade nästa rad antingen commits eller rullar tillbaka. Detta kommer att radikalt minska skalbarheten för din applikation jämfört med att använda Oracle-sekvenser genom att säkerställa att endast en session kan infoga en rad för ett visst group_name åt gången - de andra blockerar i väntan på sekvensen. Om du har ett system med ett relativt litet antal samtidiga användare (eller ett relativt stort antal group_name värden), som kan vara acceptabla för dig. Men i allmänhet är det en dålig praxis. Beroende på Oracle-versionen kan du kanske använda autonoma transaktioner för att öka samtidigheten, men det ger bara ytterligare en bit av komplexiteten till lösningen. När du verkligen är orolig för skalbarhet, skulle du verkligen vilja trycka tillbaka på hela designen och bara använda en Oracle-sekvens.



  1. Beräknar du ett glidande medelvärde för MySQL?

  2. Hitta kolumner som bara innehåller nollor

  3. Behöver hjälp med att konvertera date i formatet 20120130 till Date data type oracle sql

  4. "O" i ORDBMS:PostgreSQL Inheritance