2011-04-21 30 views
3

我有一個PL/SQL腳本,它使用SYS.UTL_HTTP通過HTTP獲取一些XML數據。 但網絡速度很慢。 我會打開5-10個同時HTTP連接,獲取5-10頁並處理它。 如何在PL/SQL中並行處理這些網絡請求?Oracle PL/SQL網絡請求並行

回答

2

最簡單的選擇可能是產生多個數據庫作業,並讓每個作業都有一個子集。根據Oracle的版本,您可以使用DBMS_JOBDBMS_SCHEDULER包產卵自己的工作要做到這一點,即

FOR x IN (SELECT url_to_access FROM table_of_urls) 
LOOP 
    dbms_job.submit(l_jobid, 
        'BEGIN procedure_to_access_url(' || x.url_to_access || '); END;'); 
END LOOP; 

如果你是在11.2,但是,甲骨文提供了一個框架,讓數據庫使用DBMS_PARALLEL_EXECUTE package自動將作業分配給DBMS_SCHEDULER作業。

0

單個PL/SQL無法輕易產生線程。你可以做的是有多個utl_http.req變量。那麼你

v_req1 := utl_http.begin_request('http....'); 
v_req2 := utl_http.begin_request('http....'); 
v_req3 := utl_http.begin_request('http....'); 
v_req4 := utl_http.begin_request('http....'); 
v_resp := utl_http.get_response(v_req1); 
... 
v_resp := utl_http.get_response(v_req2); 
... 
v_resp := utl_http.get_response(v_req3); 
... 
v_resp := utl_http.get_response(v_req4); 
... 

是否實際工作更快取決於另一端的服務器。儘管在這種情況下處理錯誤可能會很痛苦。