怎么能让一个序列每天取值都是从1开始呢?

pass2005 2009-04-08 09:16:35
我现在数据库里有个表,存放工单号,工单号是有年月日+4位当天流水组成的,如200904090001,每天必须保证从0001开始,当天的每个流水不重复,一个号删除后,不重复使用,我想了想,只能从序列取,但是序列怎么保证每天都从0001开始呢?
...全文
2016 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
pass2005 2009-04-08
  • 打赏
  • 举报
回复
多谢楼上的几位,尤其是yhuib,
我发现那个存储过程没有定义序列下面几个属性,是不需要的么?
minvalue 1
maxvalue 999999999999999999999999999
start with 1

下面这句就是吧序列的下一个值付给vn_number,但是我觉得没有实际意思,是否可以去掉
execute immediate 'select '||pi_sequence_name||'.nextval from dual' into vn_number;
changeking 2009-04-08
  • 打赏
  • 举报
回复
有了储存过程,再写一个job就可以了
begin
dbms_job.submit( job => :job,
what => 'P_TOOLS_RESET_SEQUENCES;',
next_date => select trunc(sysdate+1)+1/3600/24,
interval => 'trunc(sysdate)+1/3600/24' );
commit;
end;
/
阿三 2009-04-08
  • 打赏
  • 举报
回复
每天用job将序列drop掉,然后再重新建
yhuib 2009-04-08
  • 打赏
  • 举报
回复
聊天窗口好像不太好用,刚才明明看见有条消息但是点开就没有
pass2005 2009-04-08
  • 打赏
  • 举报
回复
楼上的语句有个问题,如果当前有个工单号200904070004,然后我又删除了这个工单,那如果在添加一个新的工单的话,这个工单号又是200904070004了,工单号就被重复使用。
pyxyu 2009-04-08
  • 打赏
  • 举报
回复
不用序列,用当天最大"工单号"+1,若无为"0001"
获得工单号
select nvl(TO_NUMBER(max(工单号))+1,TO_CHAR(sysdate,'yyyymmdd')||'0001') as 新工单号 from 表
where SUBSTR(工单号,1,8)=TO_CHAR(sysdate,'yyyymmdd')

yhuib 2009-04-08
  • 打赏
  • 举报
回复
那就在oracle中加个job,设定为每天0:00执行
pass2005 2009-04-08
  • 打赏
  • 举报
回复
execute immediate 'select '||pi_sequence_name||'.nextval from dual' into vn_number;
这个为什么有两句,vn_number又 不是返回值,有必要要这个么。
pass2005 2009-04-08
  • 打赏
  • 举报
回复
这个存储过程什么时候执行呢,oracle能设置每天0:00执行这个存储过程么?
yhuib 2009-04-08
  • 打赏
  • 举报
回复
如果是存储过程就用我上面给的P_TOOLS_RESET_SEQUENCES
重置序列号就可以了
pass2005 2009-04-08
  • 打赏
  • 举报
回复
在程序里用sql语句重置序列号?
yhuib 2009-04-08
  • 打赏
  • 举报
回复
如果不用存储过程的话直接drop序列号再重建就好了,
如果用存储过程的话

create or replace procedure P_TOOLS_RESET_SEQUENCES
(
pi_sequence_name in varchar2
)
as
vn_number number;
vr_sequence user_sequences%rowtype;
begin
-- Modify the last number
select * into vr_sequence from user_sequences t where t.sequence_name=pi_sequence_name;
if vr_sequence.max_value-vr_sequence.last_number>0 then
execute immediate 'alter sequence '||pi_sequence_name||' increment by '||(vr_sequence.max_value-vr_sequence.last_number)|| ' nocache';
execute immediate 'select '||pi_sequence_name||'.nextval from dual' into vn_number;
execute immediate 'alter sequence '||pi_sequence_name||' increment by 1 nocache';
execute immediate 'select '||pi_sequence_name||'.nextval from dual' into vn_number;
end if;
exception
when others then
null;
end P_TOOLS_RESET_SEQUENCES;
yhuib 2009-04-08
  • 打赏
  • 举报
回复
每天重置序列号
光义 2009-04-08
  • 打赏
  • 举报
回复


晒晒..学习了..
rockywu 2009-04-08
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 pass2005 的回复:]
每天0:00触发好像不是'trunc(sysdate)+1/3600/24' 这样写的吧
[/Quote]
每天0:01开始...
trunc(sysdate)+1/(24*60*60)每天0:01开始...
上面很多解决方案...任LZ选择..
pass2005 2009-04-08
  • 打赏
  • 举报
回复
dbms_job.submit(:job1,'MYPROC;',sysdate,'trunc(sysdate+1)+1/60/24');
pass2005 2009-04-08
  • 打赏
  • 举报
回复
每天0:00触发好像不是'trunc(sysdate)+1/3600/24' 这样写的吧

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧