Introduction:
In this article, i am going to explain about how to access/use large clob/lob objects over/using http.
Main:
We can easily transfer clob object in oracle database to remote server using http via port number 80.
Firewall restrictions on the network containing the image file server prevent any direct access to the image server from the database server, other than web page access on port 80 to a web server front end used to serve images on the source system. In other words, the only way to get images from the image server is via HTTP.
use the Oracle PL/SQL packages UTL_HTTP and DBMS_LOB to transfer the files over the network using the HTTP protocol,
Here is the code,
-- create image table with list of URLs
-- and retrieve those images via HTTP
declare
cursor img_list is -- image URLs to retrieve
select img_url from img_list;
r_img_list img_list%rowtype;
lBlob blob; -- locator for current image
l_http_request utl_http.req;
l_http_response utl_http.resp;
l_raw raw(32767); -- blob buffer
begin
dbms_output.put_line('*** Begin image load.');
open img_list;
loop
fetch img_list into r_img_list;
exit when img_list%notfound;
-- initialize image table row with empty blob
insert into web_img(img_num, img_url, img_blb, ins_ts)
values(web_img_seq.nextval, r_img_list.img_url, empty_blob(), systimestamp)
returning img_blb into lBlob; -- save pointer for local use
dbms_output.put_line('Attempt retrieval of: ' || r_img_list.img_url);
-- attempt to retrieve image via HTTP
l_http_request := utl_http.begin_request(r_img_list.img_url); -- request
l_http_response := utl_http.get_response(l_http_request); -- response back
dbms_output.put_line(' HTTP stat code: ' || l_http_response.status_code);
dbms_output.put_line(' HTTP resp reason phrase: ' ||
l_http_response.reason_phrase);
if l_http_response.status_code = 200 then /* image file found */
dbms_lob.open(lBlob, dbms_lob.lob_readwrite);
begin
loop
utl_http.read_raw(l_http_response, l_raw, 32767);
dbms_lob.writeappend (lBlob, utl_raw.length(l_raw), l_raw);
end loop;
exception
when utl_http.end_of_body then
utl_http.end_response(l_http_response);
end; /* retrieving BLOB parts */
dbms_lob.close(lBlob);
dbms_output.put_line(' Image URL loaded: '
|| web_img_seq.currval || ' '
|| r_img_list.img_url);
else /* image not found */
dbms_output.put_line(' No Image at this URL');
utl_http.end_response(l_http_response);
end if;
end /* img_list */ loop;
close img_list;
commit;
dbms_output.put_line('*** Done importing images.');
exception /* unexpected error, close everything and get out */
when others then
dbms_output.put_line('Unexpected error');
utl_http.end_response(l_http_response);
close img_list;
raise;
end;
-- create image table with list of URLs -- and retrieve those images via HTTP declare cursor img_list is -- image URLs to retrieve select img_url from img_list; r_img_list img_list%rowtype; lBlob blob; -- locator for current image l_http_request utl_http.req; l_http_response utl_http.resp; l_raw raw(32767); -- blob buffer begin dbms_output.put_line('*** Begin image load.'); open img_list; loop fetch img_list into r_img_list; exit when img_list%notfound; -- initialize image table row with empty blob insert into web_img(img_num, img_url, img_blb, ins_ts) values(web_img_seq.nextval, r_img_list.img_url, empty_blob(), systimestamp) returning img_blb into lBlob; -- save pointer for local use dbms_output.put_line('Attempt retrieval of: ' || r_img_list.img_url); -- attempt to retrieve image via HTTP l_http_request := utl_http.begin_request(r_img_list.img_url); -- request l_http_response := utl_http.get_response(l_http_request); -- response back dbms_output.put_line(' HTTP stat code: ' || l_http_response.status_code); dbms_output.put_line(' HTTP resp reason phrase: ' || l_http_response.reason_phrase); if l_http_response.status_code = 200 then /* image file found */ dbms_lob.open(lBlob, dbms_lob.lob_readwrite); begin loop utl_http.read_raw(l_http_response, l_raw, 32767); dbms_lob.writeappend (lBlob, utl_raw.length(l_raw), l_raw); end loop; exception when utl_http.end_of_body then utl_http.end_response(l_http_response); end; /* retrieving BLOB parts */ dbms_lob.close(lBlob); dbms_output.put_line(' Image URL loaded: ' || web_img_seq.currval || ' ' || r_img_list.img_url); else /* image not found */ dbms_output.put_line(' No Image at this URL'); utl_http.end_response(l_http_response); end if; end /* img_list */ loop; close img_list; commit; dbms_output.put_line('*** Done importing images.'); exception /* unexpected error, close everything and get out */ when others then dbms_output.put_line('Unexpected error'); utl_http.end_response(l_http_response); close img_list; raise; end; |
In this above code,i use oracle package UTL_HTTP for transfering and getting resposes
1.Request the URL using UTL_HTTP.BEGIN_REQUEST.
2.Receive response from web site using UTL_HTTP.GET_RESPONSE.
3.If the response code is 200 (URL found), open the BLOB in the table, otherwise go back to step 1 with the next URL.
4.Read the contents of the URL in 32K chunks using UTL_HTTP.READ_RAW in a local PL/SQL block until you’ve reached the end of the URL and append each 32K chunk to the end of the destination BLOB using DBMS_LOB.WRITE_APPEND.
5.Close the destination BLOB.
6.Get the next URL in step 1; if there are no more, proceed to step 7
7.Close the cursor, commit all transactions.
thatsit,
Conclusion:
Hope this helps,
Happy coding.
Superb blog post, I have book marked this internet site so ideally I’ll see much more on this subject in the foreseeable future!