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

Javascript 在页面加载时不断检查Oracle记录,javascript,jquery,sql,ajax,oracle-apex,Javascript,Jquery,Sql,Ajax,Oracle Apex,我基本上有一个页面,当加载时,读取Oracle SQL表中的特定记录id,该记录id当前可能不存在,因为将该特定记录插入表中可能需要一分钟的时间 基于此,我需要一种在等待记录存在时显示“加载图像”的方法,因此必须等待。一旦它这样做了,我想删除加载图像并向用户提供记录详细信息。为此,我正在使用Oracle Application Express 4.2 我的问题不是图像的加载/隐藏,而是如何在页面加载过程中不断检查Oracle表中的记录 要么我成功接收到记录,然后隐藏图像,要么说在1分钟后,我取消

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

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

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


要么我成功接收到记录,然后隐藏图像,要么说在1分钟后,我取消对记录的检查,并向用户显示一条消息,表明未找到任何记录。

对不起,我的英语太差了。我会尽力帮助你

  • 使您的“加载图像”在页面上始终可见。没有必要在加载时显示它,您只需要在适当的时刻隐藏它
  • 将应用程序进程添加到应用程序中。将其命名为“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
    

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

  • 使您的“加载图像”在页面上始终可见。没有必要在加载时显示它,您只需要在适当的时刻隐藏它
  • 将应用程序进程添加到应用程序中。将其命名为“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
    

    既然NoGotnu已经回答了,我就把这个放在这里:

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

    第二,虽然NoGotnu的答案会起作用,但我想指出,在apex 4.2中,您应该使用,而不是从未记录过的htmldb_Get构造。是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\u alert,如

    您将在作业的plsql代码中发出警报信号,并在ondemand流程代码中注册对警报的兴趣,并使用waitone/any,超时时间为60秒。很长时间的民意测验。

    既然NoGotnu已经回答了,我就把这个放在这里:

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

    第二,虽然NoGotnu的答案会起作用,但我想指出,在apex 4.2中,您应该使用,而不是从未记录过的htmldb_Get构造。是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\u alert,如

    您将在作业的plsql代码中发出警报信号,并在ondemand流程代码中注册对警报的兴趣,并使用waitone/any,超时时间为60秒。长时间投票。

    如何创建此记录?这是您启动的过程,还是运行的作业,还是某个过程?嗨,Tom,这实际上是一个从另一个Oracle APEX应用程序启动此作业的包过程,该应用程序随后在后台运行,但在从该应用程序创建此作业后,用户可以从该应用程序,单击一个链接,然后调用我在上面的原始帖子中描述的流程,即调用另一个Oracle APEX应用程序。在页面加载期间,我希望显示加载图像,直到这个作业在我的表中实际存在。希望这是有意义的。谢谢。你是如何制作这张唱片的?这是您启动的过程,还是运行的作业,还是某个过程?嗨,Tom,这实际上是一个从另一个Oracle APEX应用程序启动此作业的包过程,该应用程序随后在后台运行,但在从该应用程序创建此作业后,用户可以从该应用程序,单击一个链接,然后调用我在上面的原始帖子中描述的流程,即调用另一个Oracle APEX应用程序。在页面加载期间,我希望显示加载图像,直到这个作业在我的表中实际存在。希望这是有意义的。谢谢。你好,汤姆!谢谢你的回答。我知道apex.server.process,但我试着给出一个通用方法的例子,它可以在e