我想以形成产生象值的序列:创建的字母数字序列
A00000000
A00000001
..
..
..
A99999999
B00000000
B00000001
..
..
应当与初始字母字符A产生并且一旦它到达A99999999应改为B等。
Oracle中的正常序列不会给出字母数字序列。如何在这种模式下生成顺序值?
我想以形成产生象值的序列:创建的字母数字序列
A00000000
A00000001
..
..
..
A99999999
B00000000
B00000001
..
..
应当与初始字母字符A产生并且一旦它到达A99999999应改为B等。
Oracle中的正常序列不会给出字母数字序列。如何在这种模式下生成顺序值?
您可以创建一个数字序列,但可以动态地将前两个字符转换为十六进制值。如果您创建序列:
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等。
您必须创建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;
函数生成从A00000000
到Z99999999
IDS。诀窍是CHR(ascii_code)
函数,该函数返回位置65-90上的字符,即A-Z。
编辑:
功能变得更为普遍 - 你可以通过任何顺序,参数,你可以简单地在开始添加/删除数字WITH和序列定义的MAXVALUE子句,而不需要改变功能。
这个答案可能有帮助:http://stackoverflow.com/questions/26943146/creating-oracle-sequence-that-starts-with-alphanumeric – Loci
标题中的“随机”是指什么? –
随机意味着将以该格式生成的序列 – Anonymous