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

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启动后台执行链时,需完成两个操作:

  1. 记录进程ID到页面项P1_PROCESS_ID,示例PL/SQL代码:
-- 假设启动后台链后获取到进程ID l_job_id
apex_util.set_session_state('P1_PROCESS_ID', l_job_id);
  1. 立即显示加载圈,示例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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 16:13:14