create or replace type SMSPHONE is table of varchar2(20);
create or replace procedure PRO_SMS_MASS_SEND(v_targetNumber in smsphone, v_beginTime in date, v_endTime in date, v_hour in varchar2, o_msg out integer) is type v_smsId_type is table of number index by binary_integer; v_smsid v_smsId_type; v_smsidtmp v_smsId_type; v_sql varchar2(1000); v_cnt number; begin v_sql := 'insert into sms_mass_send (sms_id, target_number,begin_time, end_time, hour) values(:smsId, :targetNumber,:beginTime, :endTime, :hour)';
v_cnt := 0; for i in 1 .. v_targetNumber.count LOOP select seq_smsid.nextval into v_smsId(i) from dual; if v_targetNumber(i) is null then v_cnt := v_cnt + 1; v_smsidtmp(v_cnt) := v_smsId(i); end if; end loop;
--使用批量插入 forall i in 1 .. v_targetNumber.count execute immediate v_sql using v_smsId(i), v_targetNumber(i), v_beginTime, v_endTime, v_hour;
if v_smsidtmp.count > 0 then v_sql := 'delete sms_mass_send where sms_id = :1'; --使用批量删除 forall i in 1 .. v_smsidtmp.count execute immediate v_sql using v_smsidtmp(i); end if;
commit; o_msg := 1; exception when others then rollback; o_msg := 0; dbms_output.put_line(sqlerrm); end;
测试过程------------------------------------------------------------------------------------
declare v_targetnumber smsphone := smsphone(); v_date1 number; v_date2 number; v_time number; o_msg number; begin
for i in 1 .. 50000 loop v_targetnumber.extend; v_targetnumber(v_targetnumber.count) := '1891999' || i; end loop; execute immediate 'truncate table sms_mass_send';
select to_number(to_char(systimestamp, 'yyyymmddHH24missff')) into v_date1 from dual; pro_sms_mass_send(v_targetnumber => v_targetnumber, v_begintime => sysdate, v_endtime => sysdate, v_hour => 1, o_msg => o_msg); select to_number(to_char(systimestamp, 'yyyymmddHH24missff')) into v_date2 from dual; v_time := v_date2 - v_date1; dbms_output.put_line('使用批量绑定插入时间:' || v_time/1000/1000 || '秒'); end;
|