Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Membuat urutan Oracle yang dimulai dengan alfanumerik

Hanya urutan bernilai integer yang dapat dibuat.

Jadi pernyataannya harus:

CREATE SEQUENCE invoice_nun
  START WITH 1
  INCREMENT BY 1;

Anda dapat mengonversi nilai yang diambil menjadi string dan menambahkan awalan yang sesuai.

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

Anda dapat membuat fungsi untuk mensimulasikan urutan yang mengembalikan nilai string yang sesuai

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

sekarang Anda dapat melakukannya

select next_invoice_nun 
  from dual;

Urutan seperti yang didefinisikan di atas menggunakan beberapa nilai default. Ini didokumentasikan dalam Referensi Bahasa SQL Database . Ini setara dengan pernyataan berikut

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

Anda harus mengetahui hal-hal berikut:

1) Jika transaksi mengambil nilai urutan dan memutar kembali maka nilai urutan hilang. Jadi jika Anda melakukan hal berikut:

-- 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 invoicetable but the invoice id INV00000002` hilang karena pernyataan yang mengambilnya dibatalkan

2) Jika instance crash, semua urutan yang ada di cache instance akan hilang. Dalam contoh Anda, nilai default untuk cache yang digunakan adalah 20. Jadi, jika instance mogok, paling banyak 20 nilai urutan dapat hilang. alternatifnya adalah menggunakan kata kunci NOCYCLE jika Anda membuat urutan tetapi ini akan membawa hukuman kinerja.

3) Jika Anda menggunakan nomor urut sistem RAC tidak mewakili urutan pengambilan pernyataan. Jadi kemungkinan pernyataan pertama mendapat id INV00000021 dan pernyataan kedua mendapatkan id INV00000001 jika pernyataan kedua dieksekusi pada contoh yang berbeda dari pernyataan pertama. Ini karena instans mengambil 20 nomor urut pertama dalam cache-nya dan instans lainnya mengambil 20 nomor urut kedua dalam cache-nya. Pernyataan pertama dieksekusi pada instance yang mengambil 20 nomor urut kedua. Anda dapat menggunakan ORDER kata kunci untuk menghindari hal ini tetapi sekali lagi ini akan membawa hukuman kinerja

Jadi seseorang dapat menghindari 2) dan 3) untuk harga penalti kinerja tetapi tidak ada cara untuk menghindari 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. Jalankan DDL dinamis dalam prosedur PL/SQL melalui izin peran penentu

  2. Cara mengimpor data excel ke tabel Toad 9.5

  3. Java - arti sebenarnya http.maxConnections

  4. Pengenalan Paket PL/SQL Di Database Oracle

  5. Masalah Django inspectdb menggunakan database Oracle