我现在数据库里有个表,存放工单号,工单号是有年月日+4位当天流水组成的,如200904090001,每天必须保证从0001开始,当天的每个流水不重复,一个号删除后,不重复使用,我想了想,只能从序列取,但是序列怎么保证每天都从0001开始呢?
解决方案 »
- Oracle 的全文检索时间长了,全文检索的索引表就越来越大了,请问如何整理
- 如何在Report Builder中将报表转换成EXCEL
- 高手请看,一个不好解决的问题(急等回复)
- 用vs c#开发,数据库oracle 9i,用户表的用户名如SupEr,查询时用super或SUPER都不能查询,求解
- oracle not in 根子查询,如果自查询过大,会得到不正确的结果。。。。。。
- 列名是个关键字 select ,选择语句怎样写?
- 100分,求ORACLE9.2.0.4在REDHAT ES4下的安装文档
- Oracle为什么使用PL/SQL?
- 求一个sql表达式?
- 在java中对Oracle的Long型数据如何操作?
- 向大家请教一个问题
- Oracle数据库中用户问题
如果用存储过程的话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;
重置序列号就可以了
这个为什么有两句,vn_number又 不是返回值,有必要要这个么。
获得工单号
select nvl(TO_NUMBER(max(工单号))+1,TO_CHAR(sysdate,'yyyymmdd')||'0001') as 新工单号 from 表
where SUBSTR(工单号,1,8)=TO_CHAR(sysdate,'yyyymmdd')
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;
/
我发现那个存储过程没有定义序列下面几个属性,是不需要的么?
minvalue 1
maxvalue 999999999999999999999999999
start with 1下面这句就是吧序列的下一个值付给vn_number,但是我觉得没有实际意思,是否可以去掉
execute immediate 'select '||pi_sequence_name||'.nextval from dual' into vn_number;
trunc(sysdate)+1/(24*60*60)每天0:01开始...
上面很多解决方案...任LZ选择..