Oracle Apex 20.2(IR):如何获取选中行并逐行调用函数处理数据
从Oracle APEX交互式报表(IR)获取选中行并逐行执行函数的实现
1. 给交互式报表添加复选框列
首先需要在IR中添加用于选择行的复选框列:
- 打开IR编辑界面,进入列属性页
- 点击「添加列」,选择「复选框」类型
- 设置列的静态ID为
select_row,绑定值设为报表的主键列(比如EMP_ID),确保选中时能获取每行的唯一标识
2. 前端编写选中行收集与提交逻辑
创建一个按钮(比如「批量处理」),设置其行为为「执行JavaScript代码」,编写脚本收集选中行ID并提交到后端:
function processSelectedRows() { const selectedIds = []; // 替换为你的IR静态ID,比如"emp_report" const reportWidget = apex.region("emp_report").widget(); // 遍历选中的复选框,收集ID reportWidget.find("input[type='checkbox'][name='select_row']:checked").each(function() { selectedIds.push($(this).val()); }); if (selectedIds.length === 0) { apex.message.alert("请至少选择一行"); return false; } // 通过AJAX提交到后端回调过程 apex.server.process("PROCESS_SELECTED_ROWS", { x01: selectedIds.join(",") }, { success: function(response) { apex.message.showPageSuccess(response.successMsg); // 展示处理失败的行 if (response.failedIds.length > 0) { apex.message.alert("处理失败的行ID:\n" + response.failedIds.join("\n")); } // 刷新报表更新显示 apex.region("emp_report").refresh(); }, error: function(xhr) { apex.message.alert("处理出错:" + xhr.responseText); } }); return true; }
3. 后端创建AJAX回调处理过程
在APEX应用中创建AJAX回调过程,命名为PROCESS_SELECTED_ROWS,编写PL/SQL逻辑逐行调用处理函数:
DECLARE l_selected_ids apex_t_varchar2; l_success_count NUMBER := 0; l_failed_ids apex_t_varchar2 := apex_t_varchar2(); BEGIN -- 解析前端传入的ID列表 l_selected_ids := apex_string.split(:x01, ','); -- 逐行处理选中记录 FOR i IN 1..l_selected_ids.COUNT LOOP BEGIN -- 调用自定义处理函数,替换为你的业务函数名 IF update_employee_info(l_selected_ids(i)) THEN l_success_count := l_success_count + 1; ELSE l_failed_ids.EXTEND; l_failed_ids(l_failed_ids.COUNT) := l_selected_ids(i); END IF; EXCEPTION WHEN OTHERS THEN -- 捕获异常,记录失败ID及错误信息 l_failed_ids.EXTEND; l_failed_ids(l_failed_ids.COUNT) := l_selected_ids(i) || '(错误:' || SQLERRM || ')'; END; END LOOP; -- 返回JSON格式的处理结果给前端 apex_json.open_object; apex_json.write('successMsg', '成功处理 ' || l_success_count || ' 条记录'); apex_json.write('failedIds', l_failed_ids); apex_json.close_object; END;
4. 编写业务处理函数
根据需求实现处理函数(比如更新员工信息),示例如下:
FUNCTION update_employee_info(p_emp_id IN NUMBER) RETURN BOOLEAN IS BEGIN -- 替换为你的业务逻辑,比如更新员工状态或其他信息 UPDATE employees SET last_updated = SYSDATE, status = 'UPDATED' WHERE emp_id = p_emp_id; RETURN SQL%ROWCOUNT > 0; EXCEPTION WHEN OTHERS THEN RETURN FALSE; END;
注意事项
- 确保IR的静态ID与JS代码中的
apex.region("emp_report")一致 - 处理函数中的事务控制根据业务需求调整(是否需要COMMIT)
- 权限设置:确保执行该过程的用户有对应的表操作权限
内容的提问来源于stack exchange,提问作者Ahmed Haroon
相关产品推荐
相关产品推荐

