在oracle数据库中,如何造一个序列,如何能生成000a,000b,000c… 00ab,00ac…
不可能
用代码写吧
1.主体实现方法是oracle里的while loop循环
2.需要你自己建一张维表,按顺序列出你想展示的字母
3.建一张结果表,从第2步里的维表结合第1步的while loop循环,根据需要,把输出结果insert进结果表里
其实就是将字母映射到数字,但问题是,为什么你题目中还会出现0?这个是存在歧义的,
比如,在'000z'之后,是'00a0'还是'00aa'?
也就是说,先要确定你的进制,是二十六进制还是二十七进制,即a表示的是0还是1?
下面这个例子是27进制的,即把 0/a/b/c..z 这27个字符映射到 0/1/2..26 这27个数字上去
--创建一个数字自增序列
create sequence test_seq_alpha
minvalue 1
maxvalue 99999999999
start with 1
increment by 1
order;
--创建一个函数,将序列转换成自定义的二十七进制字符串
create or replace function get_next_alpha_seq return varchar2 is
next_num number;
type arr is table of number index by pls_integer;
obj arr;
r varchar2(4);
begin
select test_seq_alpha.nextval into next_num from dual;
declare
i number := 1;
begin
loop
obj(i) := (next_num mod 27) + 96;
next_num := trunc(next_num / 27);
if next_num <= 26 then
obj(i + 1) := next_num + 96;
exit;
end if;
i:=i+1;
end loop;
end;
for i in reverse 1 .. obj.count loop
r := r || replace(chr(obj(i)),chr(96),'0');
end loop;
return lpad(r, 4, '0');
end;
/
--使用这个函数,获得字母自增
select get_next_alpha_seq from dual;
另外一种方式就是建个表来存,每次查一下表,加1,但同样会遇到用二十六进制还是二十七进制的问题。
而我这个代码则不需要再建表,用oracle自带的序列进行存储即可.
但需要注意的是,由于这段代码按题目要求限制了4位,那么最多只能输出 27的4次方个值,超过会报错,当然你可以修改一下字符长度和lpad补全的长度