oracle生成编号(当前日期+4位流水号)自动增长,流水号的规则是:1月1号又从0001重新开始,每次递增1.

我做了一天了 流水号我是用序列生成的 ,现在关键就是每个月1号要从零开始。而且1号从0001开始 一次 然后又0002,0003,。。。
代码如下
create or replace function getmoduleno(qianzhui varchar2) --参数是前缀;
return varchar2
is
moduleno varchar2(50);--物料设计单编号
curdate varchar2(20); --当前日期;
nextseq number; --下一个序列值;
liushuihao varchar(4); --保存流水号;
curdd varchar(4); --当前日期的日;
curseq number;--当前序列值
begin
select to_char(sysdate,'yyyyMMdd') into curdate from dual;-- 获取当前日期20120804;

select to_char(sysdate,'dd') into curdd from dual;
select seq_moduleno.currval into curseq from dual;
if curdd = '01' then
dbms_output.put_line(curseq);
execute immediate 'alter sequence seq_moduleno increment by '||(1-curseq);
select seq_moduleno.nextval into nextseq from dual; -- 序列初始化;
select seq_moduleno.currval into curseq from dual; -- 序列初始化;
dbms_output.put_line(nextseq);
dbms_output.put_line(curseq);
execute immediate 'alter sequence seq_moduleno increment by 1'; --设置序列增长值为1;
commit;
else
select seq_moduleno.nextval into nextseq from dual;
end if;

if nextseq<10 then
liushuihao := '000'||nextseq;
elsif nextseq<100 then
liushuihao := '00'||nextseq;
elsif nextseq<1000 then
liushuihao := '0'||nextseq;
else liushuihao := nextseq;
end if;
moduleno :=qianzhui ||curdate ||liushuihao;
return moduleno;
end;
现在的主要问题是每个月序列 怎么让他只从0001 ,开始一次

为什么用sequence呢,另外一个序号表放序列号更好啦,写个定时的脚本每月1号0点把序列号更新为1,在你取号的方法中每取一个号,就把序号表里的序号加1追问

关键是定时的脚本不会写啊 ??我的 qq: 450903631 可以私聊吗 解决了的话肯定会很感谢你 ,分肯定也少不了的

追答

把序号更新为1的存储过程或语句会写吧?

create or replace procedure proc_auto_exec_job as
begin
declare
job number;
BEGIN
DBMS_JOB.SUBMIT(
JOB => job, /*自动生成JOB_ID*/
WHAT => 'proc_update_xuhao;', /*更新序号的存储过程或SQL语句*/
NEXT_DATE => sysdate, /*初次执行时间,立刻执行*/
INTERVAL => 'TRUNC(LAST_DAY(SYSDATE ) + 1)' /*每月1号0点执行*/
);
COMMIT;

DBMS_JOB.RUN(job);
end;
end proc_auto_exec_job;
begin proc_auto_exec_job;
end;

温馨提示:答案为网友推荐,仅供参考
相似回答