运行 Oracle 调度程序时出现错误:ORA-20001:必须从应用程序会话中调用此过程
Posted
技术标签:
【中文标题】运行 Oracle 调度程序时出现错误:ORA-20001:必须从应用程序会话中调用此过程【英文标题】:Run Oracle scheduler with error: ORA-20001: This procedure must be invoked from within an application session 【发布时间】:2016-12-12 07:08:18 【问题描述】:我正在使用 Oracle Apex 构建交互式报告。目前,我使用apex_mail
包创建了一个触发器,以便在表更新时发送电子邮件。我还创建了一个调度程序,它运行一个每天更新表的过程。程序可以自己运行成功,但是在job中运行时,job失败,详细错误为
ORA-20001: This procedure must be invoked from within an application session.
ORA-06512: at "APEX_050000.WWV_FLOW_MAIL", line 562
ORA-06512: at "APEX_050000.WWV_FLOW_MAIL", line 588
ORA-06512: at "APEX_050000.WWV_FLOW_MAIL", line 621
ORA-06512: at "APEX_050000.WWV_FLOW_MAIL_API", line 47
ORA-06512: at "USER.EMAIL_UPDATED", line 3
ORA-04088: error during execution of trigger 'USER.EMAIL_UPDATED'
ORA-06512: at "USER.CHANGE_CURRENT_CONTACT", line 19
ORA-06512: at line 1
只有将use_current_session属性设置为true,我才能使用如下命令成功运行作业。
BEGIN
DBMS_SCHEDULER.RUN_JOB(
JOB_NAME => 'update_contact',
USE_CURRENT_SESSION => TRUE);
END;
我在互联网上搜索,发现这与安全问题有关。我尝试使用select workspace_id from apex_applications where application_id = :p_app_id
添加工作区ID 并添加命令wwv_flow_api.set_security_group_id(workspace_id);
。但这不起作用。
以下是我发送邮件的源代码。
create or replace trigger email_updated
after update on users_info
for each row
begin
apex_mail.send(
p_to => 'Helen@oracle.com',
p_from => 'Jason@oracle.com',
p_body => '',
p_body_html => '<b>Please</b> review the app for details');,
p_subj => 'Alert Email');
end;
我该如何解决?提前感谢您的帮助!
【问题讨论】:
我也遇到了同样的问题,但是通过 select workspace_id from apex_applications where application_id = :p_app_id 并添加了命令 wwv_flow_api.set_security_group_id(workspace_id);在 apex_mail.send() 调用之前在相同的函数和过程/函数中。希望这会对你有所帮助。 这不适用于我的程序 【参考方案1】:不要使用 apex_mail 发送邮件,而是尝试使用基于 UTL_SMTP 或 UTL_MAIL 的另一个过程。你可以在这里找到例子(sending email from Oracle)。 APEX_MAIL 无法从计划的作业中运行,因为该作业在单独的会话中运行。
【讨论】:
以上是关于运行 Oracle 调度程序时出现错误:ORA-20001:必须从应用程序会话中调用此过程的主要内容,如果未能解决你的问题,请参考以下文章
从终端运行时出现“java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver”错误