2014-10-17 78 views
1

我需要生成唯一的標識符,它必須不再是5的長度,因爲它的數字不適合,有沒有辦法在oracle數據庫中生成唯一的字符串?如何生成oracle字符串序列?

+0

您需要能夠表示多少個值?使用一個正常的序列,但存儲十六進制等價物將使您從100,000個值到1,048,756,但這可能仍然太低?使用26個字符將得到11,881,376個可能的值;包括數字會給60,466,176。但更復雜的是,轉換一個序列。 – 2014-10-17 11:35:51

+0

爲什麼限制在5? (架構改變會讓imo更有意義)。另外,即使你堅持5限制,你需要多少個獨特的值?可能最好更改架構並使用數字或sys_guid。 – tbone 2014-10-17 13:26:51

+0

5上的lemetation是因爲來自客戶端的準備休息API的文檔,我需要超過10億個對象。 – 2014-10-17 17:01:45

回答

0

這可能幫助: http://www.deep-data-mining.com/2012/06/five-ways-of-creating-unique-record.html

該位看起來有用:

據Oracle文檔,SYS_GUID生成並返回一個全局唯一標識符(原糖值),由16個字節。

例如,我們的Oracle系統上,我可以這樣做:

select sys_guid() uniq_id from dual; 

而得到這樣的:

059D828192804EABE05400144FFB6CA7 

下一次我:

059D828192A34EABE05400144FFB6CA7 

一些數字每次遞增。

我可以限制到5個字符,其中包括每次運行時改變字符串的位:

select substr(sys_guid(),9,5) uniq_id from dual; 

爲了得到例如

92D14 
+3

正如我所看到的,您只是剪切了生成的字符串,並且它可能不是唯一的。 – 2014-10-17 11:27:16

+0

是的,對不起,我想我的回答可能是一堆舊垃圾: - \抱歉。我認爲這個號碼是獨一無二的,但也許它不會是我不確定的。對不起浪費時間。 – 2014-10-17 11:36:04

2

您可以嘗試使用基地36:http://en.wikipedia.org/wiki/Base_36

SQL:Base 36 to Base 10 conversion using SQL only

由於評論這個答案,我加入一個例子:

該函數將基地10號碼到由字母組成的基地。

create or replace 
function basen(n10 in number, letters in varchar2) return varchar2 as 
    s  varchar2(1000); 
    len  number := length(letters); 
    base10 number := n10; 
begin 
    if len <= 0 then 
    return null; 
    end if; 

    loop 
    if base10 < len then 
     return substr(letters, base10+1, 1) || s; 
    end if; 
    s := substr(letters, mod(base10, len)+1,1) || s; 
    base10 := floor(base10/len); 
    end loop; 

    return s; 
end baseN; 

這個函數轉換從base10到base36:

create or replace function base36(n10 in number) return varchar2 as 
begin 
    return basen(n10, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'); 
end base36; 

用戶可以創建一個共同序列與適當的MINVALUE和MAXVALUE和在觸發使用的方法之一的上方,SQL等

2

此方法使用HEX格式的數字。

select to_char(seq.nextval, 'fm0XXXX') 
    from dual; 

或者這更緊湊的方法使用的所有符號的ASCII碼33和122之間:

select num, 
     chr(33 + mod(floor(num/(90*90*90*90)), 90))|| 
     chr(33 + mod(floor(num/(90*90*90)), 90))|| 
     chr(33 + mod(floor(num/(90*90)),90))|| 
     chr(33 + mod(floor(num/90),90))|| 
     chr(33 + mod(num,90)) as x00000 
from (select seq.nextval as num 
     from dual); 

基本上,這是基於90號的表示。