SET pagesize 50000;
SET long 50000;
SET SERVEROUTPUT ON SIZE 40000
set serveroutput on size unlimited
CREATE OR REPLACE Function ya_pos (addr IN VARCHAR2)
RETURN VARCHAR2
AS
TEXT CLOB;
POS VARCHAR2(50);
BEGIN
TEXT := load_xml('geocode-maps.yandex.ru/1.x/?geocode='||addr);
SELECT
extractValue(
extract(
extract(
extract(VALUE(t),'/ymaps/GeoObjectCollection/*','xmlns="http://maps.yandex.ru/ymaps/1.x"'),
'featureMember/*','xmlns="http://www.opengis.net/gml"'),
'GeoObject/*','xmlns="http://maps.yandex.ru/ymaps/1.x"'),
'Point/pos','xmlns="http://www.opengis.net/gml"')
INTO POS
FROM TABLE(XMLSequence(XMLType(TEXT))) t;
RETURN POS;
END;
/
CREATE OR REPLACE Function get_pos (addr IN VARCHAR2)
RETURN VARCHAR2
AS
tmp VARCHAR2(500);
pos VARCHAR2(50);
BEGIN
tmp := REPLACE(addr,' ','+');
pos := ya_pos(tmp);
RETURN pos;
END;
/
BEGIN
DBMS_OUTPUT.ENABLE;
DBMS_OUTPUT.PUT_LINE(get_pos('Санкт-Петербург, Вяземский переулок, 5/7'));
END;
/
exec dbms_network_acl_admin.create_acl(acl => 'resolve.xml',description => 'resolve acl', principal =>'ARTEM', is_grant => true, privilege => 'resolve');
exec dbms_network_acl_admin.assign_acl(acl => 'utl_http.xml', host =>'*');
select utl_inaddr.get_host_name('127.0.0.1') from dual;
begin
dbms_network_acl_admin.create_acl (
acl => 'utl_http.xml',
description => 'HTTP Access',
principal => 'ARTEM',
is_grant => TRUE,
privilege => 'connect',
start_date => null,
end_date => null
);
dbms_network_acl_admin.add_privilege (
acl => 'utl_http.xml',
principal => 'ARTEM',
is_grant => TRUE,
privilege => 'resolve',
start_date => null,
end_date => null
);
dbms_network_acl_admin.assign_acl (
acl => 'utl_http.xml',
host => 'www.geocode-maps.yandex.ru',
lower_port => 80,
upper_port => 80
);
commit;
end;
load_xml('geocode-maps.yandex.ru/1.x/?geocode=Санкт-Петербург+Новоизмайловский+проспект,16,корпус+8');
CREATE OR REPLACE Function load_xml (p_url IN VARCHAR2)
RETURN clob
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);
-- 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 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;
-- Relase the resources associated with the temporary LOB.
RETURN l_clob;
DBMS_LOB.freetemporary(l_clob);
EXCEPTION
WHEN OTHERS THEN
UTL_HTTP.end_response(l_http_response);
DBMS_LOB.freetemporary(l_clob);
RAISE;
END load_xml;
/
BEGIN
DBMS_OUTPUT.ENABLE;
DBMS_OUTPUT.PUT_LINE(load_xml('geocode-maps.yandex.ru/1.x/?geocode=Санкт-Петербург+Новоизмайловский+проспект,16,корпус+8'));
END;
/