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
相关产品推荐
相关产品推荐

