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;
end loop;
commit;
end insert_duty_and_remark;
自己第一次写的存储过程(动态批量插入)
最新推荐文章于 2024-05-30 18:00:22 发布