Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.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
使用Oracle PL/SQL XMLQUERY和XQuery而不是“提取(XML)”有什么优势_Xml_Oracle_Oracle11g_Oracle12c - Fatal编程技术网

使用Oracle PL/SQL XMLQUERY和XQuery而不是“提取(XML)”有什么优势

使用Oracle PL/SQL XMLQUERY和XQuery而不是“提取(XML)”有什么优势,xml,oracle,oracle11g,oracle12c,Xml,Oracle,Oracle11g,Oracle12c,我注意到Oracle 11g中不推荐使用Oracle EXTRACTXML函数 我曾经通过以下方法进行XML处理: DECLARE TYPE xmltype_table IS TABLE OF xmltype INDEX BY PLS_INTEGER; vt_xml_tab xmltype_table; v_xml xmltype; BEGIN --Generate simple XML document to pretend we received it by som

我注意到Oracle 11g中不推荐使用Oracle EXTRACTXML函数

我曾经通过以下方法进行XML处理:

DECLARE
  TYPE xmltype_table IS TABLE OF xmltype INDEX BY PLS_INTEGER;
  vt_xml_tab xmltype_table;
  v_xml      xmltype;
BEGIN
  --Generate simple XML document to pretend we received it by some interface
  SELECT xmltype(dbms_xmlgen.getxml('select level, dbms_random.random rnd from dual connect by level<1000')) INTO v_xml FROM dual;

  --Get nodes
  SELECT VALUE(xm) xmlt BULK COLLECT INTO vt_xml_tab FROM TABLE(xmlsequence(v_xml.extract('/ROWSET/ROW/LEVEL'))) xm;

  --Do whatever processing I like
  FOR i IN 1..vt_xml_tab.count LOOP
    dbms_output.put_line(vt_xml_tab(i).extract('LEVEL/text()').getstringval());
  END LOOP;
END;
/
由于EXTRACT已被弃用,Oracle建议我使用XMLQUERY:

我想将我之前的处理重写如下:

DECLARE
  TYPE xmltype_table IS TABLE OF xmltype INDEX BY PLS_INTEGER;
  vt_xml_tab xmltype_table;
  v_xml      xmltype;
BEGIN
  --Generate simple XML document to pretend we received it by some interface
  SELECT xmltype(dbms_xmlgen.getxml('select level, dbms_random.random rnd from dual connect by level<1000'))
    INTO v_xml
    FROM dual;

  SELECT xmlquery('for $i in /ROWSET/ROW
      return $i/LEVEL' passing rowset_xml RETURNING content)
    INTO v_xml
    FROM (SELECT v_xml rowset_xml FROM dual);

  --Get nodes
  SELECT VALUE(xm) xmlt BULK COLLECT INTO vt_xml_tab FROM TABLE(xmlsequence(v_xml)) xm;

  --Do whatever processing I like
  FOR i IN 1 .. vt_xml_tab.count LOOP
    FOR x IN (SELECT extractvalue(vt_xml_tab(i), 'LEVEL') lvl FROM dual) LOOP
      dbms_output.put_line(x.lvl);
    END LOOP;
  END LOOP;
END;
/
但事实证明,在我用挂钟测量的机器上,使用XMLQUERY要慢0.8秒而不是1.8秒

有没有更好的方法不使用提取函数