2015-06-10 46 views
3

我想以形成产生象值的序列:创建的字母数字序列

A00000000 
A00000001 
.. 
.. 
.. 
A99999999 
B00000000 
B00000001 
.. 
.. 

应当与初始字母字符A产生并且一旦它到达A99999999应改为B等。

Oracle中的正常序列不会给出字母数字序列。如何在这种模式下生成顺序值?

+1

这个答案可能有帮助:http://stackoverflow.com/questions/26943146/creating-oracle-sequence-that-starts-with-alphanumeric – Loci

+0

标题中的“随机”是指什么? –

+0

随机意味着将以该格式生成的序列 – Anonymous

回答

3

您可以创建一个数字序列,但可以动态地将前两个字符转换为十六进制值。如果您创建序列:

create sequence s42 start with 1000000000 maxvalue 1599999999; 

...然后有一个功能简化,尽管你不严格需要它:

create function alpha_seq return varchar2 as 
begin 
    return to_char(trunc(s42.nextval/100000000), 'FMXX') 
    || substr(to_char(s42.currval, 'FM0000000000'), 3); 
end; 
/

序列值始终是10位。前两个被拉下来并转换为它们的十六进制等值,然后其余的被附加。

作为一个演示:

select alpha_seq from dual 
connect by level < 5; 

ALPHA_SEQ 
---------- 
A00000000 
A00000001 
A00000002 
A00000003 

-- skip a load of numbers 
alter sequence s42 increment by 99999994; 
select alpha_seq from dual; 

ALPHA_SEQ 
---------- 
A99999997 

alter sequence s42 increment by 1; 

select alpha_seq from dual 
connect by level < 5; 

ALPHA_SEQ 
---------- 
A99999998 
A99999999 
B00000000 
B00000001 

-- skip a load of numbers 
alter sequence s42 increment by 99999996; 
select alpha_seq from dual; 

ALPHA_SEQ 
---------- 
B99999997 

alter sequence s42 increment by 1; 

select alpha_seq from dual 
connect by level < 5; 

ALPHA_SEQ 
---------- 
B99999998 
B99999999 
C00000000 
C00000001 

在序列的最大值意味着,如果你再次调用NEXTVAL将上升到F99999999,然后错误。我假设第一个数字应该是十六进制的;如果你想AZ,那么你可以使序列开始为6500000000,并将前两位数字转换为与chr()相反的字符,而不是将65转换为A等。

+0

有没有反正一旦它达到Z99999999,我需要从AA0000000开始下一个搜索,AA0000001 .....像这样.. – Anonymous

+0

@Arun - 只是前两位数字,或AAA ...等一次那些用尽了?将每个数字的行为从0-9改为0-Z并不会很简单。走到19,1A,... 1F,20,... 29,2A,...即在基数36处将更容易。 –

+0

这是否可以通过使用现有序列本身来完成? – Anonymous

4

您必须创建1个序列和1个转换函数:

当与 next_id('num_seq')称为
CREATE SEQUENCE num_seq 
START WITH 6500000000 
INCREMENT BY 1 
MAXVALUE 9099999999; 

FUNCTION next_id(seq_name) RETURN VARCHAR2 IS 
    x VARCHAR2(28); 
BEGIN 
    EXECUTE IMMEDIATE 'SELECT TRIM(TO_CHAR(' || seq_name || '.NextVal)) FROM dual' INTO x; 
    RETURN CHR(TO_NUMBER(SUBSTR(x, 1, 2))) || SUBSTR(x, 3); 
END; 

函数生成从A00000000Z99999999 IDS。诀窍是CHR(ascii_code)函数,该函数返回位置65-90上的字符,即A-Z。

编辑:
功能变得更为普遍 - 你可以通过任何顺序,参数,你可以简单地在开始添加/删除数字WITH和序列定义的MAXVALUE子句,而不需要改变功能。

+0

谢谢帕维尔:)它的工作,我会根据我的要求修改序列 – Anonymous

+0

是否有一旦它达到Z99999999,我需要从AA0000000开始下一个搜索,AA0000001 .....等等.. @Pavel – Anonymous

+0

@arun是的,它可能与1 seq。你必须计算范围开始,然后采取相应的范围,减去开始和翻译的价值。例如。 r 0〜a00000000 = 0,r1〜aa0000000 = 2600000000,r2〜aaa000000 = 2600000000 + 26 * 26 * 10^7,r(i)= r(i-1)+ 26^i * 10 ^(9-i) –