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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 20:50:35