我有一个PL / SQL脚本,它使用SYS.UTL_HTTP通过HTTP获取一些XML数据。 但网络很慢。 我会打开5到10个同时HTTP连接,获取5-10页并处理它。 如何在PL / SQL中并行化这些网络请求?
答案 0 :(得分:2)
最简单的选择可能是生成多个数据库作业,并让每个作业都调用一部分。根据Oracle版本,您可以使用DBMS_JOB
或DBMS_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,则Oracle提供了一个框架,使数据库可以使用DBMS_PARALLEL_EXECUTE
package自动将工作分配给多个DBMS_SCHEDULER
作业。
答案 1 :(得分: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);
...
实际上是否工作得更快取决于另一端的服务器。但是,在这种情况下处理错误可能会很痛苦。