create or replace procedure insert_duty_and_remark(datestr in varchar) is
--选择没有插入值班的用户 cursor cur is select u.id from cmsuser u where u.password is not null and u.cmsroleid=2 and u.id not in ( select distinct c.ccid from duty c where c.tdate = to_date(datestr,'yyyy-mm') ) order by u.id; --该月的备注的数目 contentnum number; --存储临时时间 datetime date; --存储该月的天使 mouthnum number; --由于while i number; --临时存储sql语句 sqls varchar(500); --由于时间过度 temvardate varchar(200);
begin i :=1;
--转换传过来的时间 select to_date(datestr,'YYYY-MM') into datetime from dual; --求得该月份的天数 select to_number(to_char(last_day(to_date(datestr,'YYYY-MM')),'dd')) into mouthnum from dual; --求该月的备注数目 select count(*) into contentnum from dutyremark u where to_char(u.datetime,'yyyy-mm') = datestr;
--一:插入备注 --判断该月的备注是否已存在 if contentnum=0 then while i<= mouthnum loop begin temvardate := to_char(datetime,'YYYY-MM-dd'); sqls := 'insert into dutyremark (datetime,content) values(to_date('||''''||temvardate||''''||','||''''||'YYYY-MM-DD'||''''||'), '||''''||' '||''''||')'; dbms_output.put_line(sqls); dbms_output.put_line(datetime); dbms_output.put_line(i); execute immediate sqls; datetime := datetime+1; i:= i + 1; end; end loop; dbms_output.put_line('--------备注插入结束--------'); i:=1; datetime := datetime - mouthnum; end if;
--二:插入值班状态 --循环用户 for cur_result in cur loop
begin dbms_output.put_line('----------------'); --循环给月的天数 while i<= mouthnum loop
begin temvardate := to_char(datetime,'YYYY-MM-dd'); sqls:='insert into duty(id,tdate,ccid,status) values (id.nextval,to_date('||''''||temvardate||''''||','||''''||'YYYY-MM-DD'||''''||'),'||to_char(cur_result.id)||',0)'; dbms_output.put_line(sqls); dbms_output.put_line(datetime); dbms_output.put_line(i); execute immediate sqls; datetime := datetime+1; i:= i + 1; end;
end loop; --再一次初始化参数 i:=1; datetime := datetime - mouthnum; end;