自己第一次写的存储过程(动态批量插入)


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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值