我基本上有一个页面,在加载时,读取一个Oracle SQL表,查找当前可能不存在的特定记录ID,因为将该特定记录插入表中可能需要一分钟。
基于此,我需要一种在等待记录存在时显示“加载图像”的方法,因此必须等待。一旦它,我想删除加载图像并向用户显示记录详细信息。我正在使用Oracle Application Express 4.2。
我的问题不是加载/隐藏图像,而是如何在页面加载期间不断检查Oracle表中的记录。
要么我成功收到记录然后隐藏图像或者在1分钟后说出,我会忽略对记录的检查并向用户显示一条消息,表明没有找到记录。
答案 0 :(得分:1)
抱歉我的英文。我会尽力帮助你。
示例:
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长期民意调查。