You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle APEX非空校验通过后才执行PL/SQL过程的问题咨询

问题核心原因

你当前配置失效的原因很直接:APEX里绑定在按钮上的「执行服务端代码」类动态动作,默认不会等待页面内置校验的返回结果。哪怕你开了字段必填、按钮开了执行校验,动态动作也会直接向后端发请求跑PL/SQL,根本不管校验过没过,所以空值也会触发发邮件逻辑。

落地配置方案

做前端拦截+服务端兜底的双层校验,完全匹配你的需求,不会漏:

1. 前端动态动作调整(实现空值弹提示、拦截后端请求)

找到你绑在Submit按钮上的发邮件动态动作,修改它的执行条件:

  • 条件类型选JavaScript expression
  • 表达式填入以下代码:
const subjVal = $v('P1_SUBJECT').trim();
const msgVal = $v('P1_MESSAGE').trim();

// 空值时弹出对应字段的错误提示
if (!subjVal) {
  apex.message.showErrors([{
    type: apex.message.TYPE.ERROR,
    location: ["page", "inline"],
    pageItem: "P1_SUBJECT",
    message: "Subject 不能为空",
    unsafe: false
  }]);
}
if (!msgVal) {
  apex.message.showErrors([{
    type: apex.message.TYPE.ERROR,
    location: ["page", "inline"],
    pageItem: "P1_MESSAGE",
    message: "Message 不能为空",
    unsafe: false
  }]);
}

// 仅当两个字段都非空时,才允许动态动作继续执行
return subjVal && msgVal;

这个配置生效后,点击按钮会先跑JS校验:只要有一个字段为空,直接弹对应错误提示,动态动作直接终止,根本不会发请求到后端;只有两个字段都填了值,才会继续执行后面的PL/SQL逻辑。
另外确认下这个动态动作的Fire on initialization设为Off,避免页面刚加载就误触发。

2. 服务端PL/SQL加兜底校验(防前端校验被绕过)

前端校验永远可以被技术手段绕过,必须在PL/SQL逻辑最前面加非空判断,从根源上堵死空值执行的可能:

begin
  -- 入参非空校验
  if trim(:P1_SUBJECT) is null or trim(:P1_MESSAGE) is null then
    apex_error.add_error(
      p_message => 'Subject、Message为必填项,请补充完整后提交',
      p_display_location => apex_error.c_inline_in_notification
    );
    return;
  end if;

  -- 原有发邮件逻辑
  apex_mail.send(
    p_to   => 'person@exmaple.com',
    p_from => 'me@example.com',
    p_body => :P1_MESSAGE || utl_tcp.crlf,
    p_subj => :P1_SUBJECT);
    
  apex_mail.push_queue; -- 手动触发邮件队列推送,避免邮件延迟数小时才发出
  commit;
end;
补充说明

你之前开的字段Value required属性、按钮的Execute Validation属性不用关,APEX自带的校验会和你自定义的校验叠加,多一层防护。配置完清下浏览器缓存再测:空值点提交会直接弹错误,不会发邮件;填完两个字段再点,才会正常执行存储过程发邮件。

内容的提问来源于stack exchange,提问作者kiric8494

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 08:09:14