1

I basically have a page that when loads, reads an Oracle SQL table for a specific record id that may not currently exist at the point as it may take up to a minute to insert this specific record into the table.

Based on this, I need a means of showing a "Loading Image" while it waits for the record to exist, so has to wait. Once it does, I want to remove the loading image and present the user with the record details. I am using Oracle Application Express 4.2 for this.

My question is not so much the loading/hiding of the image but how to continually check for the record within the Oracle table, during page load.

Either I receive the record successfully and then hide the image or say after 1 minute, I dismiss the checking of the record and present the user with a message indicating that no record was found.

4

2 回答 2

1

对不起我的英语不好。我会尽力帮助你。

  1. 使您的“加载图像”始终在页面上可见。加载时无需显示,您只需在适当的时候隐藏它。
  2. 将应用程序流程添加到您的应用程序。例如,将其命名为“GET_MY_ROW”。进程必须检查您的事件,并返回一些标志,例如 1 或 0。

例子:

declare
  l_cnt number;
begin
  select count(*)
   into l_cnt
   from table1 t
   where id = 12345;
  if l_cnt > 0 then
    htp.p(1);
  else
    htp.p(0);
  end if;
end;

3.3 添加 javascript 代码作为页面加载事件(例如通过动态操作):

Javascript代码:

var myInterval = setInteral(function {
    var get = new htmldb_Get(null,$v('pFlowId'),'APPLICATION_PROCESS=GET_MY_ROW',$v('pFlowStepId'));
    get.GetAsync(function(pRequest) {
        if (pRequest.readyState == 4) {
            if (pRequest.responseText == 1) {
                alert('Record loaded successfully');
                // add function call, hiding your "Loading image" here
                clearInterval(myInterval);
            }
        };
    });
    get = null;
}, 5000); //check every 5 seconds

setTimeout(function() {
    alert('Sorry, no record was found. Try again later.');
    clearInterval(myInterval);
}, 60000); // fail after 1 minute
于 2013-07-15T07:52:00.360 回答
0

由于 NoGotnu 已经回答,我将把它放在这里:

是否有任何理由通过工作调用该程序?这是创建所需记录的唯一方法吗?工作在其他地方被调用吗?为什么不在提交所需页面并在那里显示加载图标时直接调用该过程?当它完成时,用户知道它已经完成。这将涉及更少的摆弄,因为您可以让 apex 在页面提交时显示处理图形。然后,您可以在另一个页面上通知用户该进程尚未运行,他们必须先执行此操作。

其次,虽然 NoGotnu 的回答会起作用,但我想指出,在 apex 4.2 中,您应该使用apex.server 命名空间,而不是从未记录过的 htmldb_Get 构造。apex.server.process是 jQuery ajax 设置的干净实现。NoGotnu 的代码翻译如下:

apex.server.process( "GET_MY_ROW"
                    , null
                    , {  dataType: text
                       , success: function(pData){
                          if (pData == 1) {
                             clearInterval(myInterval);
                             alert('Record loaded successfully');
                          };
                         }
                      }
                   );

调用实际上并不需要异步,但是可以。

另一种选择是实现“长轮询”,而不是每 5 秒触发一次 ajax 事件。长轮询只会启动对服务器的调用并等待响应。只要服务器忙,客户端就会等待。要实现这一点,您可以使用 dbms_alert,如在 Oracle PL/SQL 中等待提交的作业完成?
您将在作业的 plsql 代码中发出警报,并在按需流程代码中注册对警报的兴趣,并使用 waitone/any 和 60 秒超时。Presto 长民意调查。

于 2013-07-15T10:53:08.250 回答