
在 Oracle APEX 中,可通过动态操作(DA)的“Execute Server-side Code”动作或 apex.server.process AJAX 调用,将 JavaScript 设置的页面项(如 P43_ROW_SELECT)值实时传至服务端 PL/SQL,无需整页提交,兼顾响应性与数据一致性。
在 oracle apex 中,通过 javascript(如 `$s("p43_row_select", idvalues)`)设置页面项后,该值默认仅存在于客户端,服务端无法直接访问——除非触发页面提交。但实际开发中,频繁提交会破坏用户体验。本文介绍两种不刷新页面即可安全、可靠地将客户端值(如 grid 选中行 rowid)同步至服务端 pl/sql 进程的工业级方案。
✅ 方案一:使用动态操作(Dynamic Action)+ “Execute Server-side Code”
这是最推荐、最简洁且与 APEX 框架深度集成的方式:
- 创建动态操作:在目标事件(如按钮点击、GRID 行选择变更)上定义 DA;
- 添加“Execute Server-side Code”动作;
- 在 PL/SQL 代码区域编写服务端逻辑(可直接引用 :P43_ROW_SELECT);
- 关键配置:在 DA 的 Server-side Condition 或 Items to Submit 区域,显式勾选 P43_ROW_SELECT —— 此步骤确保该页面项的当前值被序列化并随 AJAX 请求发送至服务端。
示例 PL/SQL 代码(置于 DA 的 Server-side Code 中):
DECLARE
l_rowids apex_application.g_v01%TYPE := :P43_ROW_SELECT;
l_rowid_list apex_t_varchar2;
BEGIN
IF l_rowids IS NOT NULL THEN
l_rowid_list := apex_string.split(l_rowids, ',');
FOR i IN 1 .. l_rowid_list.COUNT LOOP
-- 示例:根据 ROWID 更新状态
UPDATE emp SET status = 'SELECTED' WHERE rowid = CHARTOROWID(l_rowid_list(i));
END LOOP;
COMMIT;
apex_json.open_object;
apex_json.write('success', TRUE);
apex_json.write('count', l_rowid_list.COUNT);
apex_json.close_object;
END IF;
END;⚠️ 注意事项:
- 必须在 Items to Submit 中声明 P43_ROW_SELECT,否则服务端收到的值为空;
- 若需返回结果给前端,建议启用 Fire on Page Load → No,并在 DA 的 Client-side Condition 或 Success / Failure Actions 中处理响应;
- 所有数据库操作需显式 COMMIT(除非在自动提交模式下)。
✅ 方案二:使用 apex.server.process 手动 AJAX 调用
适用于需精细控制请求头、错误处理或跨组件通信的场景:
// 前端 JavaScript(例如绑定到自定义按钮)
function sendSelectedRowids() {
var gridView = apex.region("emp").call("getCurrentView"),
selectedRecords = gridView.getSelectedRecords(),
idValues = selectedRecords.map(r => r[0]).join(',');
// 使用 apex.server.process 发起异步请求
apex.server.process(
"PROCESS_SELECTED_ROWS", // 应用程序内定义的 AJAX 过程名
{
x01: idValues, // 可选:通过 x01–x10 传递简单参数
p_arg_names: ["P43_ROW_SELECT"], // 显式指定页面项名
p_arg_values: [idValues] // 对应值
},
{
success: function(pData) {
console.log("Server returned:", pData);
apex.message.success("已成功处理 " + pData.count + " 条记录");
},
error: function(xhr, status, error) {
apex.message.alert("处理失败:" + error);
}
}
);
}对应服务端需在 Shared Components > Logic > AJAX Callbacks 中创建名为 PROCESS_SELECTED_ROWS 的过程,并在其中通过 APEX_APPLICATION.G_X01 或 V('P43_ROW_SELECT') 获取值。
? 总结对比
| 方式 | 配置复杂度 | 适用场景 | 是否需预定义 AJAX Callback |
|---|---|---|---|
| Execute Server-side Code(DA 内置) | ★☆☆☆☆(极低) | 页面内轻量交互、快速迭代 | ❌ 否,直接写 PL/SQL |
| apex.server.process | ★★★☆☆(中等) | 复杂流程、多参数、跨区域调用 | ✅ 是,需在 Shared Components 中注册 |
无论选择哪种方式,均避免了整页提交(apex.submit),显著提升用户体验与系统性能。实践中,优先选用 DA 的 Execute Server-side Code——它更安全(自动处理 CSRF Token)、更易维护,且与 APEX 生命周期无缝协同。


















