PL / SQL utl_http获取xml

时间:2011-10-27 10:39:30

标签: oracle plsql

我正在尝试实施一个非常简单的PL/SQL程序,可以从网上获取xml文件。

PL/SQL代码如下:

SET serveroutput ON SIZE 40000
set escape on

create or replace procedure testProc as 

url   VARCHAR2(256) := 'http://www.mypage.com/testXML.xml';

req   sys.utl_http.req;
resp  sys.utl_http.resp;
txt   VARCHAR2(100); 

begin
  req := sys.utl_http.begin_request(url,'GET','HTTP/1.0'); 
  utl_http.set_header(req, 'content-type', 'text/xml;charset=UTF-8');   
  utl_http.set_header(req, 'content-length', length(txt));
  resp := sys.utl_http.get_response(req);

  LOOP
    sys.utl_http.read_line(resp, txt, TRUE);
    dbms_output.put_line(txt);
  END LOOP;
  sys.utl_http.end_response(resp);

EXCEPTION WHEN sys.utl_http.end_of_body THEN
sys.utl_http.end_response(resp);

end testProc;
/

我通过SQLPlus成功构建了该过程。 但是,当我尝试执行它时,我收到以下错误:

SQL> exec testProc;
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>413 Request Entity Too Large</title>
</head><body>
<h1>Request Entity Too Large</h1>
The requested resource<br />/trentad/testXML.xml<br />
does not allow request data with GET requests, or the amount of data provided in
the request exceeds the capacity limit.
</body></html>

PL/SQL procedure successfully completed.

这很奇怪,因为我想阅读的xml文件如下:

<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
    <body>Don't forget me this weekend!</body>
</note>

鉴于相同的代码,_ set_header_ functions无法正常使用HTML,正确提供其源页面,请任何人都可以解释为什么它不适用于简单的{{1}文件?

2 个答案:

答案 0 :(得分:2)

为什么要在GET请求中设置内容类型和内容长度?您的GET请求不能包含任何正文(请求实体)。这不是一个POST。

utl_http.set_header(req, 'content-type', 'text/xml;charset=UTF-8');   
utl_http.set_header(req, 'content-length', length(txt));

你必须这样做才能做出回应。

答案 1 :(得分:0)

从您关于lkuty的答案的问题看来,您正在寻找Accept标题。这会通知服务器您将接受哪种类型的响应。