如何生成oracle字符串序列?

时间:2014-10-17 11:04:19

标签: sql oracle sequence

我需要生成唯一的标识符,这些标识符必须不再是5个长度,因为它的数字不合适,有什么方法可以在oracle数据库中生成唯一的字符串?

3 个答案:

答案 0 :(得分:2)

您可以尝试使用Base 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, '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ');
end base36;

您可以使用适当的MINVALUE和MAXVALUE创建一个公共序列,并在触发器,SQL等中使用上述方法之一。

答案 1 :(得分: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的数字的表示。

答案 2 :(得分:0)

这可能会有所帮助: http://www.deep-data-mining.com/2012/06/five-ways-of-creating-unique-record.html

这个位看起来很有用:

根据Oracle文档,SYS_GUID生成并返回由16个字节组成的全局唯一标识符(RAW值)。

例如,在我们的Oracle系统上,我可以这样做:

select sys_guid() uniq_id from dual;

得到这个:

059D828192804EABE05400144FFB6CA7

下次我得到:

059D828192A34EABE05400144FFB6CA7

每次都会增加一些数字。

我可以将其限制为5个字符,包括每次运行时更改的字符串位数:

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

得到例如。

92D14