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

Tworzenie sekwencji Oracle, która zaczyna się od alfanumerycznego

Można tworzyć tylko sekwencje o wartościach całkowitych.

Zatem oświadczenie musi brzmieć:

CREATE SEQUENCE invoice_nun
  START WITH 1
  INCREMENT BY 1;

Możesz przekonwertować pobraną wartość na ciąg i dodać odpowiedni przedrostek.

select 'INV'||to_char(invoice_nun.nextval,'FM09999999') 
  from dual;

Możesz utworzyć funkcję symulującą sekwencję zwracającą odpowiednie wartości ciągu

create or replace function next_invoice_nun return varchar2
  as
  begin
  return('INV'||to_char(invoice_nun.nextval,'FM09999999') );
  end;
/ 

możesz teraz zrobić

select next_invoice_nun 
  from dual;

Sekwencja zdefiniowana powyżej wykorzystuje pewne wartości domyślne. Jest to udokumentowane w Informacji o języku bazy danych SQL . Jest to odpowiednik następującego oświadczenia

CREATE SEQUENCE invoice_nun
  CACHE 20
  NOORDER
  START WITH 1
  INCREMENT BY 1;

Powinieneś mieć świadomość następujących kwestii:

1) Jeśli transakcja pobierze wartość sekwencji i wycofa się, wartość sekwencji zostanie utracona. Jeśli więc wykonasz następujące czynności:

-- fetch invoice_id INV00000001
insert into invoices(invoice_id,...) values (next_invoice_nun,...);   
commit;
-- fetch invoice_id INV00000002
insert into invoices(invoice_id,...) values (next_invoice_nun,...);
rollback;
-- fetch invoice_id INV00000003
insert into invoices(invoice_id,...) values (next_invoice_nun,...);
commit;

identyfikatory faktur INV00000001and INV00000003are inserted in the fakturytable but the invoice id INV00000002` zostało utracone, ponieważ instrukcja, która go pobrała, została wycofana

2) Jeśli instancja ulegnie awarii, wszystkie sekwencje znajdujące się w pamięci podręcznej instancji zostaną utracone. W twoim przykładzie używana jest domyślna wartość pamięci podręcznej, która wynosi 20. Jeśli więc instancje ulegną awarii, co najwyżej 20 wartości sekwencji może zostać utraconych. alternatywą jest użycie słowa kluczowego NOCYCLE jeśli utworzysz sekwencję, ale spowoduje to obniżenie wydajności.

3) Jeśli jesteś w systemie RAC, numer kolejny nie reprezentuje kolejności pobierania wyciągu. Możliwe więc, że pierwsza instrukcja otrzyma identyfikator INV00000021 a druga instrukcja otrzymuje identyfikator INV00000001 jeśli druga instrukcja jest wykonywana w innej instancji niż pierwsza instrukcja. Dzieje się tak, ponieważ instancja pobrała pierwsze 20 numerów sekwencji ze swojej pamięci podręcznej, a druga instancja pobrała drugie 20 numerów sekwencji ze swojej pamięci podręcznej. Pierwsza instrukcja jest wykonywana na instancji, która pobrała drugie 20 numerów sekwencyjnych. Możesz użyć ORDER słowo kluczowe, aby tego uniknąć, ale to znowu przyniesie kary za wydajność

Można więc uniknąć 2) i 3) za cenę kar za wyniki, ale nie ma sposobu, aby uniknąć 2)).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Aktualizacja Salesforce z Oracle®

  2. Jaka jest różnica między ROWNUM a ROW_NUMBER w bazie danych Oracle?

  3. Łączenie kolekcji w PLSQL

  4. Oracle SQL - Not Exists - ciąg nie istnieje na liście wartości

  5. Automatyczny przyrost dla Oracle