看起来utl_http
引发的错误是有意模糊的,除非你要求Oracle更明确一些。
为了在引发异常时使错误消息更加详细,请在会话中的某个地方调用:
utl_http.set_response_error_check(true)
否则,根据
utl_http
包中的文档,在异常处理代码中可以利用以下方法获取错误信息:
utl_http.get_detailed_sqlcode
utl_http.get_detailed_sqlerrm
如果你需要处理大量请求,可以将响应分块并在 clob 中累加以解决问题:
function get_request(p_url varchar2, p_payload_text varchar2)
return clob
is
v_req utl_http.req;
v_resp utl_http.resp;
v_req varchar2(32767);
v_resp clob;
v_resp_chunked varchar2(32767);
v_xml_resp xmltype;
begin
utl_http.set_response_error_check(true);
v_req := utl_http.begin_request(
url => p_url
, method => 'POST'
, http_version => 'HTTP/1.1'
);
utl_http.set_body_charset(v_req, 'UTF-8');
utl_http.set_persistent_conn_support(false, 0);
utl_http.set_header(v_req, 'Content-Type', 'text/xml;charset=UTF-8');
utl_http.set_header(v_req, 'Content-Length', length(p_payload_text));
utl_http.write_text(v_req, p_payload_text);
v_resp := utl_http.get_response(v_req);
dbms_output.put_line(v_resp_chunked);
dbms_lob.createtemporary(v_resp,true, dbms_lob.session);
begin
loop
utl_http.read_text(v_resp, v_resp_chunked, 32767);
--dbms_output.put_line(v_resp_chunked);
dbms_lob.append(v_resp, v_resp_chunked);
end loop;
exception
when utl_http.end_of_body or UTL_HTTP.TOO_MANY_REQUESTS then
utl_http.end_response(v_resp);
dbms_output.put_line('mess:' ||SQLERRM);
end;
dbms_lob.freetemporary(v_resp);
return v_resp;
end;