我想从BING或Google中提取纬度和经度(对于oracle表中的某些地址)。我想从存储过程中执行此操作。我尝试使用UTL_DBWS程序包执行此操作,但由于缺少“操作'”,“输入参数请求格式”等详细信息,因此无法形成完整的调用。我无法为这两种地理编码服务找到wsdl文件。那么这些服务实际上是 web-api 还是 web-service ?从oracle stored-proc调用这些服务的最佳方法是什么?
答案 0 :(得分:0)
你可以查看使用utl_http的example来了解你如何做到这一点
你需要照顾好几件事
1)您需要从数据库服务器直接连接互联网
2)您需要编辑数据库ACL策略才能使其正常工作
3)你需要逃避“&”您用于搜索的网址中的符号
4)您需要使用Oracle钱包验证SSL证书
ACL示例
BEGIN
--You need DBA to execute this function where www.xml is the ACL Name
--SCOTT is the schemaname,my.oracle.com is the host to access the webpage
DBMS_NETWORK_ACL_ADMIN.CREATE_ACL(acl => 'www.xml',
description => 'WWW ACL',
principal => 'SCOTT',
is_grant => true,
privilege => 'connect');
DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(acl => 'www.xml',
principal => 'SCOTT',
is_grant => true,
privilege => 'resolve');
DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(acl => 'www.xml',
host => 'my.oracle.com');
END;
/
COMMIT;
您可以添加其他主机名以访问ACL www.xml,如下所示
BEGIN
DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(acl => 'www.xml',
host => 'www.google.co.in');
END;
/
COMMIT;
这是使用谷歌
进行纬度和经度搜索的示例 declare
httpuri HttpUriType;
x clob;
address VARCHAR2(32000):='New York';
lat_long_value VARCHAR2(4000);
begin
UTL_HTTP.set_transfer_timeout(60); --set timeout to 60 seconds
httpuri := HttpUriType('http://www.google.co.in/search?q=find+latitude+and+longitude+of+' ||address||'&'||'ie=utf-'||'8&'||'oe=utf-'||'8&'||'aq=t'||'&'||'rls=org.mozilla'||':'||'en-US'||':'||'official'||'&'||'client=firefox-a');
x := httpuri.getclob();
lat_long_value := regexp_substr(x, '<div class="_Xj">(.+)</div>');
if lat_long_value is not null then
select regexp_replace(lat_long_value,
'<div class="_Xj">(.+)</div>',
'\1')
into lat_long_value
FROM dual;
end if;
dbms_output.put_line(lat_long_value);
end;
如果收到错误
Ora-29024 Certification validation failure
请按照将Google徽书添加到Oracle钱包here
所需的步骤操作最后你得到的输出是
40.7127° N, 74.0059° W