我有一个顶级应用程序,我需要在每个月的5日向所有员工发送通知邮件。所以只是为了测试我试图每隔30秒发送一封邮件。我在一个程序上创建了一个作业调度程序来做同样的事情。这是它的PLSQL代码。
create or replace procedure send_notification_employee as
cursor c_employee is select * from EMPLOYEE;
r_employee c_employee%ROWTYPE;
begin
open c_employee;
loop
fetch c_employee into r_employee;
exit when c_employee%NOTFOUND;
APEX_MAIL.SEND(
p_to => r_employee.EMPLOYEE_EMAIL,
p_from => 'abc@gmail.com',
p_subj => 'Reminder : Meeting',
p_body => '<Some random message>');
end loop;
close c_employee;
end;
/
begin
DBMS_SCHEDULER.CREATE_JOB(
job_name => 'send_notification',
job_type => 'stored_procedure',
job_action => 'send_notification_employee',
start_date => NULL,
repeat_interval => 'FREQ=SECONDLY;INTERVAL=30',
end_date => NULL);
end;
/
begin
DBMS_SCHEDULER.enable(
name => 'send_notification');
end;
/
我猜代码是正确的。我唯一不确定的是如何在apex oracle应用程序上运行此调度程序。我应该只在SQL命令上执行这些语句还是有其他方法来执行它?
此外,我尝试在SQL命令选项卡中执行相同的语句,但我没有收到任何邮件。我的代码有问题吗?提前谢谢。
答案 0 :(得分:1)
如果从数据库而不是直接从APEX发送邮件,则需要设置安全组。您还应该在程序结束时使用push_queue来清除未发送邮件的表格。
create or replace procedure send_notification_employee as
cursor c_employee is select * from EMPLOYEE;
r_employee c_employee%ROWTYPE;
l_workspace number;
begin
-- Get a valid workspace ID
SELECT MAX(workspace_id) INTO l_workspace FROM apex_applications WHERE application_id = <valid application_id>;
-- Set Workspace
wwv_flow_api.set_security_group_id(l_workspace);
open c_employee;
loop
fetch c_employee into r_employee;
exit when c_employee%NOTFOUND;
APEX_MAIL.SEND(
p_to => r_employee.EMPLOYEE_EMAIL,
p_from => 'abc@gmail.com',
p_subj => 'Reminder : Meeting',
p_body => '<Some random message>');
end loop;
close c_employee;
-- Finally force send
APEX_MAIL.PUSH_QUEUE;
end;
重新。如何执行 - 这取决于你想做什么。如果您只想在每个月的5号运行它,只需在数据库中设置一个预定的作业即可,如上所述。如果您想在adhoc基础上运行,只需在调用过程并通过数据库执行的提交过程后在APEX中创建一个作业。
顺便说一句,如果您打算创建许多邮件程序,您可能希望创建一个帮助程序以获取工作区ID /发送邮件,并从其他邮件程序中调用它。
答案 1 :(得分:0)
这些查询可能很方便(要检查您是否有正确的设置):
检查是否安装了util_smtp
:
select * from dba_objects where object_name like 'UTL_SMTP%'
检查权限:
select grantee , table_name , privilege from dba_tab_privs where table_name = 'UTL_SMTP'
检查开放网络主机,端口:
select acl , host , lower_port , upper_port from DBA_NETWORK_ACLS;
检查网络权限:
select acl , principal , privilege , is_grant from DBA_NETWORK_ACL_PRIVILEGES