Download HTML and File using PL\SQL

  • 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;