Я использую Oracle Apex версии 22.2. У меня есть процесс pl/sql, в котором я отправляю электронное письмо, а другой процесс запускается в зависимости от статуса отправки этого электронного письма. Я могу выбрать mail_id
из apex_mail_log
и отобразить его на одном из элементов моей страницы. Но когда я пытаюсь использовать этот mail_id
для выбора mail_send_error
этой записи электронной почты, я продолжаю получать ORA-01403: no data found
(письмо отправляется независимо от этой ошибки). Я подтвердил, что он возвращает правильный mail_id только что вставленной записи. Я также подтвердил, что мой оператор select запускается просто find при запуске в SQL Workshop. Мне нужно убедиться, что это электронное письмо было действительно отправлено, прежде чем я смогу продолжить другие процессы, есть идеи?
declare
v_orgname varchar2(500);
v_mailid number;
v_mailresult number;
begin
-- select our variables to send with our email
select name into v_orgname from organizations where keyid = :P277_ORGKEYID;
v_mailid := apex_mail.send (
p_to => :P277_EMAILTO,
p_from => :P277_EMAILFROM,
p_template_static_id => 'ACTUM_WELCOME_LETTER',
p_placeholders => '{' ||
' "SITENAME":' || apex_json.stringify( v_orgname ) ||
' ,"MY_APPLICATION_LINK":' || apex_json.stringify( apex_mail.get_instance_url || apex_page.get_url( 'test' )) ||
' ,"SUBID":' || apex_json.stringify( :P277_PARENTID ) ||
'}' );
apex_mail.push_queue();
-- Using the mailid, we can select the result of that email
select nvl(mail_send_error,0) into v_mailresult from apex_mail_log where mail_id = v_mailid;
-- This page item is being set so this variable is correct, why is my process saying no data found?
select v_mailid into :P277_MAILID from dual;
-- If the result is a success, we select 1 into our mail sent variable to tell the login process to run
if v_mailresult = 0 then
select 1 into :P277_EMAILSENT from dual;
else
select 0 into :P277_EMAILSENT from dual;
end if;
end;
Проблема в том, что apex_mail.push_queue
— это асинхронный вызов. Ваш код, который будет выполняться впоследствии, не ожидает завершения фактической отправки почты. Вы можете проверить это в DBA_SYNONYMS
, где APEX_MAIL
синоним приводит к APEX_220200.WWV_FLOW_MAIL_API
. Разверните его код и увидите, что он ведет к WWW_FLOW_MAIL.PUSH_QUEUE
, который ведет к PUSH_QUEUE_BACKGROUND
, код которого:
SYS.DBMS_SCHEDULER.RUN_JOB( JOB_NAME => 'ORACLE_APEX_MAIL_QUEUE', USE_CURRENT_SESSION => FALSE );
Итак, что вы можете сделать, вы можете запустить это задание напрямую, но с USE_CURRENT_SESSION => TRUE
, если вы действительно хотите синхронно ждать результата выполнения. Другой вариант — проверить результат в отдельном блоке кода/функционала, а затем принять решение об отрисовке пользовательского интерфейса на основе этого результата.