1

在 Oracle APEX v4.2 中,我有一个应用程序,用户按下按钮,然后关闭并提交计划的后台作业,允许用户继续在应用程序中工作。该作业使用 Oracle 的 DBMS_SCHEDULER 启动。

我的问题是并希望将其保留在 Oracle APEX 空间内 - 假设有一个表存储作业何时启动以及何时完成,我如何与该表交互,检查作业是否已完成(即以某种方式轮询表格并在找到“完成”状态时停止),然后提供一个 5 秒的警报,该警报会滑入然后滑出,通知用户作业已完成。

我可以通过动态操作使用 JavaScript(回调)吗?

4

1 回答 1

0

如果您不想走插件路线,可以在应用程序进程中使用以下代码,在本例中称为 ProgressCheck:

DECLARE

CURSOR c_time_elapsed 
IS
SELECT  SUBSTR(elapsed_time,6,2)||'hrs '
       ||SUBSTR(elapsed_time,9,2)||'mins '
       ||SUBSTR(elapsed_time,12,2)||'secs'    ELAPSED_TIME
FROM    user_scheduler_running_jobs
WHERE   job_name    =   'XX_YOUR_JOB_NAME'
UNION ALL
SELECT '00:00'
FROM   DUAL
WHERE  NOT EXISTS  (SELECT  SUBSTR(elapsed_time,9)  ELAPSED_TIME
                    FROM    user_scheduler_running_jobs
                    WHERE   job_name    =   'XX_YOUR_JOB_NAME');

BEGIN

FOR r_time IN c_time_elapsed LOOP

    htp.p('<p>Time elapsed: '||r_time.ELAPSED_TIME);

END LOOP;
htp.p('');

END;

在页面标题中,包含以下 JavaScript:

<script type="text/javascript">
<!--
var myInterval;

function f_ProgressCheck(){
    var get = new htmldb_Get(null,$v('pFlowId'),'APPLICATION_PROCESS=ProgressCheck',$v('pFlowStepId'));
    gReturn = get.get();
    get = null;
    gReturn = (!gReturn)?'null':gReturn;
    $s('P1_PROGRESS_RESULT',gReturn);
}

function f_myInterval(){
         myInterval = setInterval ( "f_ProgressCheck()", 5000 );
}

//-->
</script>

这将在您的页面加载后每五秒调用一次应用程序进程,并将检查结果放入 P1_PROGRESS_RESULT。

您可以修改申请流程以满足您的要求,可能会返回其他内容或另外检查是否完成,如以下代码所示:

DECLARE

CURSOR c_job_count 
IS
SELECT  COUNT(*) TOTAL
FROM    user_scheduler_job_log
WHERE   job_name = 'XX_YOUR_JOB_NAME'
AND     log_date >= (SYSDATE - 1/1440); 

BEGIN

FOR r_job_count IN c_job_count LOOP
    IF r_job_count.total = 1 THEN
      htp.p('<p>Your data is ready to view.');
      htp.p('<p>Click Go to view the report.');
      htp.p('<input type="button" onclick="javascript:this.disabled=true;this.value=''Please wait...'';doSubmit(''REPORT'');" value="Go" class="RelevantAPEXClass" />');
    ELSE
      htp.p('<p>');
    END IF;
END LOOP;

END;

您还可以结合 PLSQL 在一个流程中交付所有内容。

您还可以使用动态操作调用 PLSQL(最好)。

于 2014-06-26T13:36:03.660 回答