oracle生成编号(当前日期+4位流水号)自动增长,流水号的规则是:1月1号又从0001重新开始,每次递增1.
我做了一天了流水号我是用序列生成的,现在关键就是每个月1号要从零开始。而且1号从0001开始一次然后又0002,0003,。。。代码如下createorreplacefu...
我做了一天了 流水号我是用序列生成的 ,现在关键就是每个月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 ,开始一次 展开
代码如下
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 ,开始一次 展开
1个回答
展开全部
为什么用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;
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询