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

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;

你可能感兴趣的:(sql,C++,c,C#)