CREATEORREPLACE PACKAGE "EDM_PACK" AS PROCEDURE FETCH_SENDER( i_current_time INNUMBER, i_other_smtp INVARCHAR2, i_unknown_smtp INVARCHAR2, o_email_id OUT NOCOPY NUMBER, o_email OUT NOCOPY VARCHAR2, o_password OUT NOCOPY VARCHAR2, o_smtp OUT NOCOPY VARCHAR2); END;
包体:
CREATEORREPLACE PACKAGE BODY "EDM_PACK" AS PROCEDURE FETCH_SENDER( i_current_time INNUMBER, i_other_smtp INVARCHAR2, i_unknown_smtp INVARCHAR2, o_email_id OUT NOCOPY NUMBER, o_email OUT NOCOPY VARCHAR2, o_password OUT NOCOPY VARCHAR2, o_smtp OUT NOCOPY VARCHAR2) IS temp_count_other_smtp NUMBERDEFAULT0; temp_anti_shield_id NUMBERDEFAULTNULL; temp_current_day DATE DEFAULTNULL; BEGIN SELECTCOUNT(DISTINCT other_smtp) INTO temp_count_other_smtp FROM anti_shields WHERE other_smtp = i_other_smtp; --查看i_other_smtp是否在反屏蔽的smtp之内 IF temp_count_other_smtp =0 THEN --此other_smtp未列入返屏蔽之内 --从anti_shields中随机取出一条符合指定other_smtp, --且sending_time大于最小间隔的记录的id UPDATE anti_shields SET sending_time = i_current_time WHERE id IN ( SELECT*FROM (SELECT id FROM anti_shields WHERE i_current_time - NVL(sending_time,i_current_time) > 86400000/NVL(count_per_day,500) AND other_smtp = i_unknown_smtp ORDERBY DBMS_RANDOM.Value ) WHERE ROWNUM <=1) RETURNING id INTO temp_anti_shield_id; ELSE --此other_smtp已列入返屏蔽之内 --从anti_shields中随机取出一条符合指定other_smtp, --且sending_time大于最小间隔的记录的id UPDATE anti_shields SET sending_time = i_current_time WHERE id IN ( SELECT*FROM (SELECT id FROM anti_shields WHERE i_current_time - NVL(sending_time,i_current_time) > 86400000/NVL(count_per_day,500) AND other_smtp = i_other_smtp ORDERBY DBMS_RANDOM.Value ) WHERE ROWNUM <=1) RETURNING id INTO temp_anti_shield_id; ENDIF; --从anti_shields中随机取出一条符合指定other_smtp, --且sending_time大于最小间隔的记录的id UPDATE anti_shields SET sending_time = i_current_time WHERE id IN ( SELECT*FROM (SELECT id FROM anti_shields WHERE i_current_time - NVL(sending_time,i_current_time) > 86400000/NVL(count_per_day,500) AND other_smtp = i_other_smtp ORDERBY DBMS_RANDOM.Value ) WHERE ROWNUM <=1) RETURNING id INTO temp_anti_shield_id; --如果得到了记录 IF temp_anti_shield_id ISNOTNULL THEN --得到指定id的记录的current_day并存入temp_current_day中 SELECT current_day INTO temp_current_day FROM anti_shields WHERE id = temp_anti_shield_id; --如果得到了当前时间 IF temp_current_day ISNOTNULL THEN --看是否更新current_day和count_day IF TO_CHAR(SYSDATE,'YYMMDD') != TO_CHAR(temp_current_day,'YYMMDD') THEN --更新current_day和count_day UPDATE anti_shields SET current_day = SYSDATE,count_day =0 WHERE id = temp_anti_shield_id; ENDIF; ENDIF; --得到我们自己SMTP服务器的ip SELECT ourself_smtp INTO o_smtp FROM anti_shields WHERE id = temp_anti_shield_id; --如果ourself_smtp不为NULL IF o_smtp ISNOTNULL THEN --随机从自已的SMTP服务器上取得一帐号 SELECT id INTO o_email_id FROM (SELECT id FROM senders WHERE ourself_smtp = o_smtp ORDERBY DBMS_RANDOM.Value ) WHERE ROWNUM <=1; --如果得到帐号 IF o_email_id ISNOTNULL THEN --得到email帐号 SELECT email INTO o_email FROM senders WHERE id = o_email_id; --得到email密码 SELECT password INTO o_password FROM senders WHERE id = o_email_id; ENDIF; --判断是否更改日发送量和发送总量 IF o_email_id ISNOTNULL AND o_email ISNOTNULL AND o_password ISNOTNULL AND o_smtp ISNOTNULL THEN --更改日发送量和发送总量 UPDATE anti_shields SET count_day = count_day +1, total_count = total_count +1 WHERE id = temp_anti_shield_id; ENDIF; ENDIF; ENDIF; EXCEPTION WHEN OTHERS THEN o_email_id :=NULL; o_email :=NULL; o_password :=NULL; o_smtp :=NULL; END; END;