Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Tạo chuỗi Oracle bắt đầu bằng chữ và số

Chỉ các chuỗi có giá trị số nguyên mới có thể được tạo.

Vì vậy, câu lệnh phải là:

CREATE SEQUENCE invoice_nun
  START WITH 1
  INCREMENT BY 1;

Bạn có thể chuyển đổi giá trị đã tìm nạp thành một chuỗi và thêm tiền tố thích hợp.

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

Bạn có thể tạo một hàm để mô phỏng một chuỗi trả về các giá trị chuỗi thích hợp

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

bây giờ bạn có thể làm

select next_invoice_nun 
  from dual;

Trình tự như đã định nghĩa ở trên sử dụng một số giá trị mặc định. Điều này được ghi lại trong Tham chiếu ngôn ngữ SQL của cơ sở dữ liệu . Nó tương đương với câu lệnh sau

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

Bạn nên biết những điều sau:

1) Nếu một giao dịch tìm nạp một giá trị trình tự và quay trở lại thì giá trị trình tự sẽ bị mất. Vì vậy, nếu bạn làm như sau:

-- 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 hóa đơn INV00000001 and INV00000003 are inserted in the bảng table but the invoice id INV00000002` bị mất vì câu lệnh tìm nạp nó đã được khôi phục lại

2) Nếu một cá thể bị treo, tất cả các chuỗi có trong bộ nhớ cache của cá thể đó sẽ bị mất. Trong ví dụ của bạn, giá trị mặc định cho bộ nhớ cache được sử dụng là 20. Vì vậy, nếu các trường hợp gặp sự cố, nhiều nhất 20 giá trị trình tự có thể bị mất. một gốc thay thế là sử dụng từ khóa NOCYCLE nếu bạn tạo trình tự nhưng điều này sẽ dẫn đến các hình phạt về hiệu suất.

3) Nếu bạn đang sử dụng một số thứ tự hệ thống RAC không đại diện cho thứ tự tìm nạp câu lệnh. Vì vậy, có thể câu lệnh đầu tiên nhận id INV00000021 và câu lệnh thứ hai nhận id INV00000001 nếu câu lệnh thứ hai được thực thi trên một phiên bản khác với câu lệnh đầu tiên. Điều này là do cá thể đã tìm nạp 20 số thứ tự đầu tiên trong bộ nhớ cache của nó và cá thể khác đã tìm nạp 20 số chuỗi thứ hai trong bộ nhớ cache của nó. Câu lệnh đầu tiên được thực hiện trên phiên bản lấy 20 số thứ tự thứ hai. Bạn có thể sử dụng ORDER từ khóa để tránh điều này nhưng điều này một lần nữa sẽ mang lại các hình phạt về hiệu suất

Vì vậy, người ta có thể tránh 2) và 3) cho cái giá của các hình phạt thực hiện nhưng không có cách nào để tránh 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. Định nghĩa cột không tương thích với định nghĩa cột được phân nhóm

  2. Làm cách nào để thêm phần bù vào một truy vấn chọn trong Oracle 11g?

  3. Ánh xạ một lớp Thực thể sang hai cơ sở dữ liệu khác nhau (Oracle và Ingres)

  4. Cắt ngắn bảng trong Oracle gặp lỗi

  5. Không thể mở lib '/usr/lib/oracle/11.2/client64/lib/libsqora.so.11.1 khi tạo mục Database Monitor trong zabbix