sql >> Database >  >> RDS >> Oracle

orakel - reeksen zonder reeks

Hoewel ik het ten zeerste zou afraden (gebruik liever een enkele reeks en accepteer gewoon dat er grotere hiaten zullen zijn dan verwacht), kunt u uw eigen pseudo-reekstabel maken

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

voeg een paar rijen in

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

en schrijf dan een functie om de volgende reekswaarde te krijgen

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;

Dit vergrendelt de rij in de tabel voor de specifieke reeks totdat de transactie die de volgende rij heeft opgehaald, zich commit of terugdraait. Dit zal de schaalbaarheid van uw applicatie radicaal verminderen in vergelijking met het gebruik van Oracle-reeksen door ervoor te zorgen dat slechts één sessie een rij kan invoegen voor een bepaalde group_name tegelijk-- de anderen blokkeren het wachten op de reeks. Als u een systeem heeft met een relatief klein aantal gelijktijdige gebruikers (of een relatief groot aantal group_name waarden), die voor u acceptabel kunnen zijn. Maar over het algemeen is het een slechte gewoonte. Afhankelijk van de Oracle-versie kunt u mogelijk autonome transacties gebruiken om de gelijktijdigheid te vergroten, maar dat maakt de oplossing alleen maar ingewikkelder. Op het moment dat je je echt zorgen maakt over schaalbaarheid, zou je echt terug willen dringen op het hele ontwerp en gewoon een Oracle-reeks gebruiken.



  1. SQL-query gebruikt geen beschikbare index (SQL Server 2008)

  2. gegevens opslaan in een database met behulp van tekst bewerken en knop

  3. 4 manieren om uren, minuten en seconden te scheiden van een tijdwaarde in MariaDB

  4. FOUT 1049 (42000):Onbekende database 'mijndatabasenaam'