Oracle Apex网格验证遇单条错误仍提交,如何阻止并保留行内提示?
解决Oracle Apex网格验证失败仍提交的问题
1. 修正行内验证代码的语法错误
你当前的验证代码存在逻辑和语法问题,首先需要调整为正确的PL/SQL逻辑:
IF :EMP_SAL < 10000 THEN RETURN :EMP_NAME || ' 的薪资低于10000'; END IF;
注意点:
- 引用网格列需要加冒号
:EMP_SAL、:EMP_NAME,这是Apex中绑定变量的标准写法 - 去掉无意义的
LOOP语句,行内验证会自动遍历所有行执行 - 先拼接错误信息再返回,原代码的赋值和返回顺序颠倒
2. 配置网格验证阻止提交的核心设置
要实现“只要有一行验证失败就阻止提交”,关键是开启网格的专属设置:
- 编辑你的交互式网格组件
- 在属性面板中找到验证分类
- 勾选验证失败时阻止提交(Prevent Submit on Validation Failure)选项
- 确认行内验证设置为“启用”,且触发时机选择你的提交按钮(When Button Pressed)
3. 备选方案:添加页面级验证兜底
如果上述网格设置不生效,可添加一个页面级验证来兜底检查:
- 在页面的“验证”区域新建一个PL/SQL验证
- 设置触发时机为你的提交按钮
- 输入以下验证代码(注意替换
G_F01为你网格中EMP_SAL对应的F列编号,可在网格的“列”属性中查看):
DECLARE l_has_error BOOLEAN := FALSE; BEGIN FOR idx IN 1..APEX_APPLICATION.G_F01.COUNT LOOP IF TO_NUMBER(APEX_APPLICATION.G_F01(idx)) < 10000 THEN l_has_error := TRUE; EXIT; END IF; END LOOP; IF l_has_error THEN APEX_ERROR.ADD_ERROR( p_message => '存在薪资不满足要求的员工,无法提交', p_display_location => APEX_ERROR.C_DISPLAY_LOCATION_INLINE_IN_NOTIFICATION ); END IF; END;
这个验证会遍历所有提交的行,只要发现错误就抛出页面级错误,彻底阻止提交,同时行内的错误提示依然会保留。
内容的提问来源于stack exchange,提问作者Velocity
相关产品推荐
相关产品推荐

