APEX 23:页面切换回后如何显示后台进程运行的加载圈
实现APEX页面切回后继续显示后台进程加载圈的方案
针对你的APEX 23 + Oracle 21c环境,要实现切回Page1时自动检测后台进程状态并显示加载圈,可按以下步骤操作:
1. 存储后台进程状态
首先需要记录后台进程的运行状态,推荐两种方式:
- APEX会话状态:适合单用户会话内的后台进程(比如
APEX_JOB),直接用页面项存储进程ID。 - 自定义状态表:适合跨会话或需要持久化的进程,创建表关联用户与进程状态:
CREATE TABLE bg_process_status ( user_id VARCHAR2(100) NOT NULL, process_id VARCHAR2(100) NOT NULL, status VARCHAR2(20) DEFAULT 'RUNNING', created_date DATE DEFAULT SYSDATE, PRIMARY KEY (user_id, process_id) );
2. 创建状态检查函数
编写PL/SQL函数,根据进程ID查询当前运行状态:
CREATE OR REPLACE FUNCTION check_bg_process_status(p_process_id IN VARCHAR2) RETURN VARCHAR2 IS l_status VARCHAR2(20); BEGIN -- 若使用DBMS_SCHEDULER作业,查询作业状态 SELECT state INTO l_status FROM dba_scheduler_jobs WHERE job_name = p_process_id; -- 若使用APEX_JOB,替换为以下查询 -- SELECT status -- INTO l_status -- FROM apex_job_status -- WHERE job_id = p_process_id; RETURN l_status; EXCEPTION WHEN NO_DATA_FOUND THEN RETURN 'COMPLETED'; -- 进程不存在则视为已完成 END; /
3. 页面加载时的状态检测逻辑
在Page1的页面属性 > JavaScript > 页面加载时添加代码,实现页面加载(含切回时)自动检查进程状态:
$(document).ready(function() { // 获取存储的进程ID(假设页面项为P1_PROCESS_ID) const processId = apex.item('P1_PROCESS_ID').getValue(); if (processId) { // 调用APEX AJAX进程检查状态 apex.server.process('CHECK_BG_PROCESS', { x01: processId }, { success: function(status) { const spinner = $('#bg-loading-spinner'); if (status === 'RUNNING') { spinner.show(); // 定时轮询状态,每3秒检查一次 const interval = setInterval(() => { apex.server.process('CHECK_BG_PROCESS', {x01: processId}, { success: function(newStatus) { if (newStatus !== 'RUNNING') { spinner.hide(); clearInterval(interval); // 清空页面项,避免下次误判 apex.item('P1_PROCESS_ID').setValue(''); } } }); }, 3000); } else { spinner.hide(); apex.item('P1_PROCESS_ID').setValue(''); } } }); } });
4. 创建APEX AJAX进程
在Page1中创建AJAX进程CHECK_BG_PROCESS,类型为PL/SQL,代码如下:
DECLARE l_process_id VARCHAR2(100) := apex_application.g_x01; l_status VARCHAR2(20); BEGIN l_status := check_bg_process_status(l_process_id); htp.p(l_status); -- 返回状态给前端 END;
5. 启动后台进程时的处理
当在Page1启动后台执行链时,需完成两个操作:
- 记录进程ID到页面项
P1_PROCESS_ID,示例PL/SQL代码:
-- 假设启动后台链后获取到进程ID l_job_id apex_util.set_session_state('P1_PROCESS_ID', l_job_id);
- 立即显示加载圈,示例JavaScript代码:
$('#bg-loading-spinner').show();
6. 添加加载圈HTML元素
在Page1的页面区域中添加加载圈的HTML(可使用APEX自带样式):
<div id="bg-loading-spinner" style="display: none; text-align: center; padding: 20px;"> <span class="apex-loading-icon"></span> <p>后台进程运行中,请稍候...</p> </div>
注意事项
- 轮询间隔可根据进程耗时调整,避免过于频繁的数据库查询
- 多用户共享的后台进程,需在状态检查时关联当前用户ID,避免状态混淆
- 进程完成后要及时更新状态(比如后台进程结束时调用存储过程更新表状态,或清空会话项)
内容的提问来源于stack exchange,提问作者Andrew Klimov
相关产品推荐
相关产品推荐

