错误样例(使用UTL_HTTP发送http请求时,报出如下错误):
原因:
1、Oracle允许使用几个PL/SQL API(UTL_TCP, UTL_SMTP, UTL_MAIL, UTL_HTTP和 UTL_INADDR)访问外部网络服务,这些API都使用TCP协议。
2、在Oracle 10g是通过一个基于用户是否被授予执行某个包的许可的 on/off开关来实现的,Oracle 11g引入了细粒度访问网络服务.
3、通过在XML DB 数据库中使用访问控制列表(ACL)来实现,允许控制哪个用户能够访问哪个网络资源,而不关心包的授权。
解决办法:
-- 查询网络访问控制列表 acl
?
1 |
Select * From dba_network_acls |
-- 查询访问控制权限列表
?
1 |
Select * From dba_network_acl_privileges |
-- 查询数据库中的用户,用户名大小写敏感
?
1 |
Select username From dba_users Where username Like '%ITS%' |
分配acl权限,执行如下sql语句:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
begin |
?
1 |
select utl_http.request('http://localhost:9000/hello?wsdl') From dual; |
若出现no listener,是因为授权主机时不能写localhost,应该写ip地址或者域名,如下图:
移除acl和权限控制
撤销分配acl到hostacl -- 与assign对应
?
1 2 3 4 5 6 7 8 9 10 11 12 |
begin |
?
1 2 3 4 5 6 7 |
begin |
?
1 2 3 4 5 |
begin |