2013-07-13 67 views
1

檢查一個Oracle記錄希望有人能幫助如何實現這一要求。不斷在頁面加載

我基本上有一個頁面,加載時,讀取一個Oracle SQL表可能目前不存在於該點的特定記錄ID,因爲它可能需要長達一分鐘才能插入此特定記錄到表中。

在此基礎上,我需要呈現出「加載圖像」,而等待存在的記錄的手段,所以必須等待。一旦這樣做,我想刪除加載圖像並向用戶提供記錄詳細信息。我正在使用Oracle Application Express 4.2。

我的問題是沒有這麼多的圖像,但如何不斷地檢查Oracle表中的記錄,頁面加載時的加載/隱藏。

要麼我成功地接收的記錄,然後隱藏圖像或說在1分鐘後,我駁回記錄的檢查和與指示沒有記錄已找到的消息呈現給用戶。

任何幫助將不勝感激。

謝謝。

+0

該怎麼製作這個記錄?它是一個你開始的程序,還是一個運行的工作,或者某個過程? – Tom

+0

嗨湯姆,它實際上是一個包裝程序,可以從另一個Oracle APEX應用程序中啓動此應用程序,然後在後臺運行,但是在從此應用程序創建此作業後,用戶可以從此應用程序單擊一個鏈接然後調用我在上述原始文章中描述的過程,即調用另一個Oracle APEX應用程序。在頁面加載過程中,我希望顯示加載圖像,直到這個工作真正在我的表格中出現。希望這是有道理的。謝謝。 – tonyf

回答

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 
0

由於NoGotnu已經回答了,我會在這裏把這個:

是否有任何理由通過工作調用程序?它是創建所需記錄的唯一方法嗎?這個工作是否在其他地方召喚?爲什麼不在提交所需頁面時直接調用該過程,並在那裏顯示加載圖標?完成後,用戶知道它已完成。這將涉及更少的擺弄,因爲您可以讓頂點在頁面提交中顯示處理圖形。然後,您可以通知其他頁面上的用戶該進程尚未運行,他們必須首先執行該操作。其次,雖然NoGotnu的答案將起作用,但我想指出,在apex 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代碼警報,並在按需過程代碼登記在警報的興趣和使用的WaitOne /任何與60秒的超時。 Presto長時間輪詢。

+0

你好,湯姆!感謝您的回答。我知道apex.server.process,但我試圖給出一個通用方法的例子,即使在APEX 3.x也可以。關於長期民意調查 - 我認爲在這個簡單的任務中,長期民意調查將會過度(或者是多餘的 - 我的英語不好)。但是,你是正確的呢;) – NoGotnu

+0

@NoGotnu如果人們都在4.2,但在使用htmldb_Get他們應得的懲罰誠實地堅持;)我的理解是有益的,但還是考慮一個jQuery的實現,即使它需要幾行額外遠遠優於。對我而言,它更加透明,我喜歡apex如何擴展它,併爲我們提供更加標準化的控制。至於長期民意調查:是的,這可能有點矯枉過正。儘管如此,通過使用dbms_alert並不難實現,並且可以殺死JavaScript中必須完成的一些繁瑣工作。但是,嘿,兩種方式都有效並且有選擇是件好事! – Tom

+0

@Tom看着你的「長期拉」的建議,會真的很感謝一個例子,因爲我實際上在SO中提出了另一個線程。請參閱「http://stackoverflow.com/questions/42825441/how-to-use-oracle-dbms-alert-within-oracle-apex – tonyf