运行作业调度程序在apex oracle上发送邮件的过程是什么?

时间:2018-03-14 07:38:21

标签: oracle oracle-apex oracle-apex-5 oracle-apex-5.1

我有一个顶级应用程序,我需要在每个月的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命令选项卡中执行相同的语句,但我没有收到任何邮件。我的代码有问题吗?提前谢谢。

2 个答案:

答案 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