在页面加载时不断检查Oracle记录

时间:2013-07-13 03:06:15

标签: javascript jquery sql ajax oracle-apex

我基本上有一个页面,在加载时,读取一个Oracle SQL表,查找当前可能不存在的特定记录ID,因为将该特定记录插入表中可能需要一分钟。

基于此,我需要一种在等待记录存在时显示“加载图像”的方法,因此必须等待。一旦它,我想删除加载图像并向用户显示记录详细信息。我正在使用Oracle Application Express 4.2。

我的问题不是加载/隐藏图像,而是如何在页面加载期间不断检查Oracle表中的记录。

要么我成功收到记录然后隐藏图像或者在1分钟后说出,我会忽略对记录的检查并向用户显示一条消息,表明没有找到记录。

2 个答案:

答案 0 :(得分:1)

抱歉我的英文。我会尽力帮助你。

  1. 让您的“加载图片”始终显示在页面上。没有必要在加载时显示它,你只需要在适当的时候隐藏它。
  2. 将Application Process添加到您的应用程序中。将其命名为例如“GET_MY_ROW”。进程必须检查您的事件,并返回一些标志,例如1或0。
  3. 示例:

    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
    

答案 1 :(得分:0)

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

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

其次,虽然NoGotnu的答案可行,但我想指出,在顶点4.2中,您应该使用apex.server namespace而不是未记录的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,如Waiting for a submitted job to finish in Oracle PL/SQL?中所述 您将在作业的plsql代码中发出警报信号,并在ondemand进程代码中注册对警报的兴趣并使用waitone / any进行60秒超时。 Presto长期民意调查。