Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从web解析XML文件时出现PL/SQL错误LPX-00249_Sql_Xml_Oracle_Plsql_Xml Parsing - Fatal编程技术网

从web解析XML文件时出现PL/SQL错误LPX-00249

从web解析XML文件时出现PL/SQL错误LPX-00249,sql,xml,oracle,plsql,xml-parsing,Sql,Xml,Oracle,Plsql,Xml Parsing,我正在用PL/SQL编写一个程序,用于从internet下载XML文件,解析它们并将值存储在Oracle数据库中。我有一个大型XML文件,其中包含大量小型XML的链接。大约有6253个文件需要解析。我有一个函数,它将XML文件下载到CLOB中,并将数据保存到XmlType中。此值将返回到程序中并进行进一步处理。这是函数: create or replace function get_xml_by_url ( v_url VARCHAR2 ) RETURN XMLType AS req

我正在用PL/SQL编写一个程序,用于从internet下载XML文件,解析它们并将值存储在Oracle数据库中。我有一个大型XML文件,其中包含大量小型XML的链接。大约有6253个文件需要解析。我有一个函数,它将XML文件下载到CLOB中,并将数据保存到XmlType中。此值将返回到程序中并进行进一步处理。这是函数:

create or replace function get_xml_by_url
( v_url VARCHAR2
) 
RETURN XMLType  
AS
  req      SYS.UTL_HTTP.REQ;
  resp     SYS.UTL_HTTP.RESP;
  xmlClob  CLOB;
  x        XmlType;
  l_offset number := 1;
  value    VARCHAR2(3999);  -- URL to post to
BEGIN
  BEGIN
    UTL_HTTP.SET_PROXY('http://10.1.250.233:8080');
    req := UTL_HTTP.BEGIN_REQUEST (url=> v_url, method => 'GET');
    UTL_HTTP.SET_HEADER(req, 'User-Agent', 'Mozilla/4.0');
    UTL_HTTP.SET_HEADER
    ( r      =>  req
    , name   =>  'Content-Type'
    , value  =>  'text/xml;charset=UTF-8'
    );
    resp := UTL_HTTP.GET_RESPONSE(req);

    DBMS_LOB.CREATETEMPORARY(xmlClob, true);

    -- Loading first line
    UTL_HTTP.READ_LINE(resp,value,false);
    DBMS_LOB.WRITE(xmlClob,length(value),l_offset,value);
    l_offset := l_offset + length(value);

    -- Loading and adjusting second line
    UTL_HTTP.READ_LINE(resp,value,true);
    value := rtrim(value,'xmlns="http://seznam.gov.cz/ovm/datafile/seznamovm/v1">')||'>';
    DBMS_LOB.WRITE(xmlClob, length(value), l_offset,value);
    l_offset := l_offset + length(value);

    -- Filling CLOB
    LOOP
      UTL_HTTP.READ_LINE(resp,value,false);
      DBMS_LOB.WRITE(xmlClob,length(value),l_offset,value);
      l_offset := l_offset + length(value);
    END LOOP;

  EXCEPTION
    when UTL_HTTP.END_OF_BODY 
    then
      UTL_HTTP.END_RESPONSE(resp);
    when others 
    then
      utl_http.end_response(resp);  
  END;
  x := XMLType.createXML(xmlClob);
  DBMS_LOB.FREETEMPORARY(xmlClob);  
  RETURN x;
END;
我在一个循环中为所有6.253XML文件调用这个函数,每次都有错误,但每次都是在不同的文件中,当我只为引发错误的一个XMl文件再次运行脚本时,它运行良好。我认为问题在于记忆,但我不知道它发生在哪里,为什么发生。
我收到以下错误:

Error report:
ORA-31011: XML parsing failed
ORA-19202: Error occurred in XML processing
LPX-00249: invalid external ID declaration
Error at line 1
ORA-06512: in "SYS.XMLTYPE", line 5
ORA-06512: in "GET_XML_BY_URL", line 47
ORA-06512: in line 29
31011. 00000 -  "XML parsing failed"
*Cause:    XML parser returned an error while trying to parse the document.
*Action:   Check if the document to be parsed is valid.
GET_XML_BY_URL是给定给所描述函数的名称。有人遇到过这种问题吗?

致以最诚挚的问候,Michal

您是否尝试将dbms_lob.createtemporary()的缓存参数设置为false?您认为这有帮助吗?我认为clob需要它,它在函数结束时被释放。45秒后,LPX-00007出现错误。我还有一组XML文件,它只有140个文件。对于此集合,程序运行良好。代码示例中缺少某些内容。请加上。请同时添加复制问题的XML文件。根据我的经验,这可能是namespace/DTD的问题。