pl/sql是非常强大的数据库语言,甚至已经不仅仅是数据库语言,可以完成大部分的逻辑任务,而且非常擅长进行与数据库交互的数据操作。偶然需要了解下pl/sql的web访问能力,这里稍作总结。以及贴一下同事给的示例代码:
一、demo代码:
1.用sys以sysdba登录,给用户授权
--授权
grant connect,resource,dba,sysdba to username;
grant execute on sys.dbms_lock to username;
begin
begin
dbms_network_acl_admin.drop_acl('username.xml');
exception
when others then
null;
end;
begin
dbms_network_acl_admin.create_acl('username.xml', 'username ACL', upper('username'), true, 'connect');
exception
when others then
null;
end;
dbms_network_acl_admin.add_privilege('username.xml', upper('username'), true, 'connect');
dbms_network_acl_admin.add_privilege('username.xml', upper('username'), true, 'resolve');
dbms_network_acl_admin.assign_acl('username.xml', '*');
dbms_java.grant_permission(upper('username'), 'SYS:java.net.SocketPermission', '*', 'connect,resolve');
dbms_java.grant_permission(upper('username'), 'java.io.FilePermission', '<<ALL FILES>>', 'execute');
dbms_java.grant_permission(upper('username'), 'java.lang.RuntimePermission', '*', 'writeFileDescriptor');
commit;
end;
2.http调用demo
create or replace function fnSendTextMessages(mobiles varchar2,
content varchar2) return varchar2 as
/**
*@paramp_dataType返回值类型:json或者xml
*@returnjson或者xml
*/
l_request utl_http.req;
l_response utl_http.resp;
l_result varchar2(32767);
l_url varchar2(4000);
l_param varchar2(4000);
begin
begin
--utl_http对象调用set_response_error_check函数传的值是false
utl_http.set_response_error_check(false);
--设置编码格式为UTF-8
utl_http.set_body_charset('UTF-8');
--utl_http.set_transfer_timeout(120);
--设置的请求路径
l_url:='http://192.168.2.2:9080/sms_api/api_send.jsp';
--初始化参数值
l_param:='token=D126827A2F218A3117E1568716FE52A3&subcode=1&mobiles='||mobiles||'&content='||UTL_URL.escape(content);
--向utl_http.begin_request函数传了两个参数,设置用post方式请求
l_request:=utl_http.begin_request(l_url,'POST');
--utl_http.set_header(l_request,'User-Agent','SmartStoredProc/5.0');
--用set_header设置请求头部
utl_http.set_header(l_request,'Content-Type','application/x-www-form-urlencoded');
--用SET_HEADER设置请求头部
UTL_HTTP.SET_HEADER(l_request,'Content-Length',LENGTHB(l_param));
--raw方式写入参数,可以避免中文变乱码
UTL_HTTP.WRITE_RAW (l_request,UTL_RAW.CAST_TO_RAW(l_param));
l_response := utl_http.get_response(l_request);
--通过utl_http发送http请求,当l_response.status_code状态值等于200,说明请求成功
if l_response.status_code = 200 then
utl_http.read_text(l_response, l_result, length(l_result));
utl_http.end_response(l_response);
else--错误处理,网络访问错误
l_result := '<resultInfo><code>-' || l_response.status_code ||
'</code><message>网络访问错误!</message><data></data></resultInfo>';
dbms_output.put_line('ERROR:' || l_result);
utl_http.end_response(l_response);
end if;
exception
--异常捕获,打印两行
when others then
dbms_output.put_line(sqlerrm);
dbms_output.put_line(dbms_utility.format_error_backtrace);
l_result := '<resultInfo><code>-1</code><message>' || sqlerrm || '</message><data></data></resultInfo>';
--当status_cod不等于200,http发送响应
if l_response.status_code is not null then
utl_http.end_response(l_response);
end if;
end;
return l_result;
end;
oracle官方对于utl_http包的文档地址:
https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_http.htm#CHDIAFFA