有订单表ORDER,单号字段OrderNo VARCHAR(10),OrderName VARCHAR(100)。需要实现自动编号,格式为YYYYMMXXXX,其中XXXX为序号,如:2014030001,2014030002.。。。。。。等。
不使用Oracle的SEQUENCE实现,而是自己定义一个管理序列的表,存放序号。使用PL/SQL程序,向订单表中增加数据,订单编号能自动生成。这个语句怎么写?


------解决方案--------------------
可以定义一个触发器,在触发器中实现学号自动生成:
create trigger tri_ol_order
before insert on t_order
for each row
declare
v_order varchar2(10);
v_date varchar2(6);
v_num number(4);
begin
select odaerno into v_order from
(select odaerno from
(select odaerno from t_order order by odaerno desc)
where rownum<2); --查询上次插入的最后一条记录的序列号
v_date :=to_char(sysdate,'yyyymm'); --当前日期字段
v_num :=substr(v_order,7,10); --后面自增字段
v_order :=v_date
------解决方案--------------------
lpad(v_num+1,4,'0'); --要插入的字段
:new.odaerno :=v_order;
exception --表为空,第一次插入数据
when no_data_found then
:new.odaerno :=to_char(sysdate,'yyyymm')
------解决方案--------------------
'0001';
end;
截图:

------解决方案--------------------
这样的function应该适用吧:
create or replace function f_f return varchar2 is
v_OrderNo varchar2(20);
v_maxNo varchar2(20);
select max(OrderNo) into v_maxNo from ORDER where OrderNo like to_char(sysdate,'yyyymm')
------解决方案--------------------
'%';
if v_maxNo is null then
v_OrderNo := to_char(sysdate,'yyyymm')
------解决方案--------------------
'00001';
else
v_OrderNo := to_char(v_maxNo+1);
end if;
return v_OrderNo;
end f_f;