运行 作业调度程序在 apex oracle 上发送邮件的过程是什么?
What will be the procedure to run a job scheduler to send mails on apex oracle?
我有一个顶点应用程序,我需要在每个月的 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 命令选项卡中执行相同的语句,但我没有收到任何此类邮件。我的代码有什么问题吗?提前致谢。
这些查询可能很方便(检查您的设置是否正确):
检查是否安装了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
如果从数据库发送邮件而不是直接从APEX发送邮件,您需要设置安全组。您还应该在过程结束时使用 push_queue 清除未发送邮件的 table。
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 日执行它,只需在数据库中设置一个计划作业即可,就像上面那样。如果您想 运行 临时 运行 只需在提交过程调用过程并通过数据库执行后在 APEX 中创建一个作业。
顺便说一句,如果您计划创建许多邮件程序,您可能希望创建一个帮助程序来获取工作区 ID/发送邮件,然后从您的其他邮件程序中调用它。
我有一个顶点应用程序,我需要在每个月的 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 命令选项卡中执行相同的语句,但我没有收到任何此类邮件。我的代码有什么问题吗?提前致谢。
这些查询可能很方便(检查您的设置是否正确):
检查是否安装了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
如果从数据库发送邮件而不是直接从APEX发送邮件,您需要设置安全组。您还应该在过程结束时使用 push_queue 清除未发送邮件的 table。
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 日执行它,只需在数据库中设置一个计划作业即可,就像上面那样。如果您想 运行 临时 运行 只需在提交过程调用过程并通过数据库执行后在 APEX 中创建一个作业。
顺便说一句,如果您计划创建许多邮件程序,您可能希望创建一个帮助程序来获取工作区 ID/发送邮件,然后从您的其他邮件程序中调用它。