运行 作业调度程序在 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/发送邮件,然后从您的其他邮件程序中调用它。