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

问题描述 投票:0回答:2

我有一个 apex 应用程序,我需要在每月 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      => '[email protected]',
        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 命令”选项卡中执行相同的语句,但我没有收到任何此类邮件。我的代码有问题吗?预先感谢。

oracle oracle-apex oracle-apex-5 oracle-apex-5.1
2个回答
2
投票

如果从数据库而不是直接从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
    apex_util.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      => '[email protected]',
        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/发送邮件,然后从其他邮件过程中调用它。


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
© www.soinside.com 2019 - 2024. All rights reserved.