Oracle Apex:无需提交页面,能否将客户端页面项值传递至服务端?
不用提交页面传值到服务端PL/SQL的方案
Oracle APEX自带的apex.server.process AJAX函数就能解决这个问题,不用整页提交,直接把前端选中的ROWID传给服务端PL/SQL流程。
第一步:创建AJAX回调流程
在页面的「处理」模块里新增一个AJAX回调类型的流程,命名比如PROCESS_SELECTED_ROWS,PL/SQL代码示例如下:
DECLARE l_selected_rowids VARCHAR2(4000); BEGIN -- 获取前端传递的ROWID列表 l_selected_rowids := apex_application.g_x01; -- 这里编写你的业务逻辑,比如批量处理选中行 -- 用apex_string.split拆分列表可避免SQL注入风险 FOR rec IN ( SELECT rowid FROM emp WHERE rowid IN ( SELECT column_value FROM apex_string.split(l_selected_rowids, ',') ) ) LOOP -- 示例操作:更新选中行状态 UPDATE emp SET is_processed = 'Y' WHERE rowid = rec.rowid; END LOOP; -- 可选:给前端返回处理结果 apex_json.open_object; apex_json.write('success', TRUE); apex_json.write('msg', '选中行处理完成'); apex_json.close_object; END;
第二步:修改前端JavaScript代码
把原来设置页面项的逻辑,替换为调用AJAX回调流程的代码:
var gridView = apex.region("emp").call("getCurrentView"), selectedRecords = gridView.getSelectedRecords(), idValues = ""; for (var i = 0; i < selectedRecords.length; i++) { var record = selectedRecords[i]; var idValue = record[0]; idValues += idValue; if (i < selectedRecords.length - 1) { idValues += ","; } } // 发起AJAX请求,传递ROWID列表到服务端 apex.server.process( "PROCESS_SELECTED_ROWS", // 对应你创建的AJAX回调流程名称 { x01: idValues }, // 通过x01参数传值,服务端用apex_application.g_x01接收 { success: function(res) { // 请求成功后的提示 apex.message.showPageSuccess(res.msg); }, error: function(xhr, status, err) { // 请求失败后的提示 apex.message.showError('处理失败:' + err); } } );
额外说明
apex.server.process会自动维护APEX会话状态,比原生XMLHttpRequest更省心,不用手动处理会话ID- 如果需要传递多个参数,除了用
x01到x10这10个内置变量,还可以传递JSON对象,服务端用apex_json包解析即可 - 如果你仍需要更新页面项
P43_ROW_SELECT,可以保留原来的$s("P43_ROW_SELECT", idValues);代码,不影响AJAX调用
内容的提问来源于stack exchange,提问作者Gatho
相关产品推荐
相关产品推荐

