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

Vytvoření sekvence Oracle, která začíná alfanumerickými

Lze vytvořit pouze celočíselné posloupnosti.

Takže příkaz musí být:

CREATE SEQUENCE invoice_nun
  START WITH 1
  INCREMENT BY 1;

Načtenou hodnotu můžete převést na řetězec a přidat příslušnou předponu.

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

Můžete vytvořit funkci pro simulaci sekvence vracející příslušné řetězcové hodnoty

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

nyní můžete udělat

select next_invoice_nun 
  from dual;

Výše definovaná sekvence používá některé výchozí hodnoty. To je zdokumentováno v Databázové SQL Language Reference . Je ekvivalentní následujícímu tvrzení

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

Měli byste si být vědomi následujících skutečností:

1) Pokud transakce načte hodnotu sekvence a vrátí se zpět, hodnota sekvence se ztratí. Pokud tedy provedete následující:

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

ID faktur INV00000001and INV00000003are inserted in the fakturytable but the invoice id INV00000002` je ztraceno, protože příkaz, který jej přinesl, byl vrácen zpět

2) Pokud dojde k selhání instance, všechny sekvence, které jsou v mezipaměti instance, jsou ztraceny. Ve vašem příkladu je použita výchozí hodnota pro mezipaměť, která je 20. Pokud tedy instance havaruje, může se ztratit maximálně 20 sekvenčních hodnot. alternativou je použít klíčové slovo NOCYCLE pokud vytvoříte sekvenci, ale bude to mít za následek snížení výkonu.

3) Pokud jste na systému RAC, pořadové číslo nepředstavuje pořadí načítání příkazu. Je tedy možné, že první příkaz získá id INV00000021 a druhý příkaz získá id INV00000001 pokud je druhý příkaz proveden na jiné instanci než první příkaz. Důvodem je, že instance načetla prvních 20 čísel sekvencí ve své mezipaměti a druhá instance načetla druhých 20 čísel sekvencí ve své mezipaměti. První příkaz se provede na instanci, která načetla druhých 20 sekvenčních čísel. Můžete použít ORDER klíčové slovo, abyste se tomu vyhnuli, ale opět to povede ke snížení výkonu

Takže se lze vyhnout 2) a 3) za cenu výkonnostních sankcí, ale neexistuje způsob, jak se vyhnout 2).



  1. Django:Skupina dotazů podle měsíce

  2. Převeďte datum z rrrr-mm-dd na dd název_měsíce rok

  3. Synchronizace databází SQL Server 2008 přes HTTP pomocí WCF &Sync Framework

  4. Testovací oprávnění MySQL