- Oracle 11 and above
Загрузка HTML-страницы и файла по URL-адресу с помощью PL\SQL
Чтобы все работало Вам необходимо:
1. Иметь привилегии:
GRANT EXECUTE ON UTL_HTTP TO USERNAME; GRANT EXECUTE ON DBMS_LOB TO USERNAME;
2. Должен быть создан файл ACL:
BEGIN DBMS_NETWORK_ACL_ADMIN.create_acl ( acl => 'all-network-PUBLIC.xml', description => 'A test of the ACL functionality', principal => 'USERNAME', is_grant => TRUE, privilege => 'connect', start_date => SYSTIMESTAMP, end_date => NULL); COMMIT; END; /
3. Выдать права на файл пользователю:
BEGIN DBMS_NETWORK_ACL_ADMIN.add_privilege ( acl => 'all-network-PUBLIC.xml', principal => 'USERNAME', is_grant => TRUE, privilege => 'connect', start_date => SYSTIMESTAMP, end_date => NULL); COMMIT; END; /
4. Настроить доступ к доменному имени сайта, например, http://www.nalog.gov.by:
BEGIN DBMS_NETWORK_ACL_ADMIN.assign_acl ( acl => 'all-network-PUBLIC.xml', host => 'www.nalog.gov.by', lower_port => 80, upper_port => NULL); COMMIT; END; /
5. Если у вас используется прокси, то разрешите и к нему доступ, например:
BEGIN DBMS_NETWORK_ACL_ADMIN.assign_acl ( acl => 'all-network-PUBLIC.xml', host => 'myproxy.it.by', lower_port => 8080, upper_port => NULL); COMMIT; END; /
6. Создадим временную таблицу для сохранения HTML-страницы и файлов:
CREATE GLOBAL TEMPORARY TABLE USERNAME.HTTP_CLOB ( url VARCHAR2(2000), page_data CLOB) ON COMMIT PRESERVE ROWS RESULT_CACHE (MODE DEFAULT) NOCACHE; CREATE GLOBAL TEMPORARY TABLE USERNAME.HTTP_BLOB ( url VARCHAR2(2000), file_data BLOB) ON COMMIT PRESERVE ROWS RESULT_CACHE (MODE DEFAULT) NOCACHE;
7. Создадим процедуру для загрузки HTML-страницы по URL-адресу:
CREATE OR REPLACE PROCEDURE USERNAME.LOAD_HTML_BY_URL (p_url IN VARCHAR2) AS l_http_request UTL_HTTP.req; l_http_response UTL_HTTP.resp; l_clob CLOB; l_text VARCHAR2(32767); BEGIN -- Initialize the CLOB. DBMS_LOB.createtemporary(l_clob, FALSE); -- Set proxy (if you need) UTL_HTTP.SET_PROXY('http://username:password@myproxy.it.by:8080'); -- Make a HTTP request and get the response. l_http_request := UTL_HTTP.begin_request(p_url, 'POST', 'HTTP/1.1'); utl_http.set_header(l_http_request, 'Content-Type', 'text/xml; charset=utf-8'); l_http_response := UTL_HTTP.get_response(l_http_request); -- Copy the response into the CLOB. BEGIN LOOP UTL_HTTP.read_text(l_http_response, l_text, 32766); DBMS_LOB.writeappend (l_clob, LENGTH(l_text), l_text); END LOOP; EXCEPTION WHEN UTL_HTTP.end_of_body THEN UTL_HTTP.end_response(l_http_response); END; -- Insert the data into the table. INSERT INTO USERNAME.HTTP_CLOB(url, page_data) VALUES (p_url, l_clob); COMMIT; -- Relase the resources associated with the temporary LOB. DBMS_LOB.freetemporary(l_clob); EXCEPTION WHEN OTHERS THEN UTL_HTTP.end_response(l_http_response); DBMS_LOB.freetemporary(l_clob); RAISE; END LOAD_HTML_BY_URL; /
8. Создадим процедурe для загрузки файла по URL-адресу:
CREATE OR REPLACE PROCEDURE USERNAME.LOAD_FILE_BY_URL (p_url IN VARCHAR2) AS l_http_request UTL_HTTP.req; l_http_response UTL_HTTP.resp; l_blob BLOB; l_raw RAW(32767); BEGIN -- Initialize the BLOB DBMS_LOB.createtemporary(l_blob, FALSE); -- Set proxy (if you need) UTL_HTTP.SET_PROXY('http://username:password@myproxy.it.by:8080'); -- Make a HTTP request and get the response l_http_request := UTL_HTTP.begin_request(p_url); l_http_response := UTL_HTTP.get_response(l_http_request); -- Copy the response into the BLOB BEGIN LOOP UTL_HTTP.read_raw(l_http_response, l_raw, 32767); DBMS_LOB.writeappend (l_blob, 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; -- Insert the data into the table INSERT INTO USERNAME.HTTP_BLOB(url, file_data) VALUES (p_url, l_blob); COMMIT; -- Relase the resources associated with the temporary LOB DBMS_LOB.freetemporary(l_blob); EXCEPTION WHEN OTHERS THEN UTL_HTTP.end_response(l_http_response); DBMS_LOB.freetemporary(l_blob); RAISE; END LOAD_FILE_BY_URL; /
9. Пример вызова процедур загрузки:
exec USERNAME.LOAD_HTML_BY_URL('http://www.nalog.gov.by/ru/reestr_ru/'); exec USERNAME.LOAD_FILE_BY_URL('http://www.nalog.gov.by/uploads/documents/10-02-2016.xls/');
10. Результаты можно увидеть по запросу:
select * from USERNAME.HTTP_CLOB; select * from USERNAME.HTTP_BLOB;