oracle生成字母序号6,创建以字母数字开头的Oracle序列
只能創建整數值序列.
所以聲明必須是:
CREATE SEQUENCE invoice_nun
START WITH 1
INCREMENT BY 1;
您可以將獲取的值轉換為字符串并添加適當的前綴.
select 'INV'||to_char(invoice_nun.nextval,'FM09999999')
from dual;
您可以創建一個函數來模擬返回適當字符串值的序列
create or replace function next_invoice_nun return varchar2
as
begin
return('INV'||to_char(invoice_nun.nextval,'FM09999999') );
end;
/
你現在可以做
select next_invoice_nun
from dual;
CREATE SEQUENCE invoice_nun
CACHE 20
NOORDER
START WITH 1
INCREMENT BY 1;
您應該了解以下內容:
1)如果事務獲取序列值并回滾,則序列值將丟失.因此,如果您執行以下操作:
-- 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;
發票idsINV00000001和INV00000003已插入theinvoicestable,但發票idINV00000002`丟失,因為提取它的語句已回滾
2)如果實例崩潰,則實例緩存中的所有序列都將丟失.在您的示例中,使用緩存的默認值為20.因此,如果實例最多崩潰,則可能會丟失20個序列值. alter native是使用關鍵字NOCYCLE如果您創建序列,但這會帶來性能損失.
3)如果您在RAC系統上,序列號不代表獲取語句的順序.因此,如果第二個語句在與第一個語句不同的實例上執行,則第一個語句可能獲取id INV00000021,第二個語句獲取id INV00000001.這是因為實例在其高速緩存中獲取了前20個序列號,而另一個實例在其高速緩存中獲取了第二個20個序列號.第一個語句在獲取第二個20個序列號的實例上執行.您可以使用ORDER關鍵字來避免這種情況,但這會再次帶來性能損失
所以人們可以避免2)和3)的性能懲罰的價格,但沒有辦法避免2).
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的oracle生成字母序号6,创建以字母数字开头的Oracle序列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 如何读取cgi_Pyth
- 下一篇: lnmp yum安装mysql_cent