【问题标题】:Loop through dynamic xmlType in oracle循环遍历oracle中的动态xmlType
【发布时间】:2018-04-25 06:27:39
【问题描述】:

我有一个以 XMLType 作为输入参数的过程,我想从传递给过程的动态 XmlType 参数中选择数据并用光标填充它(每次调用过程时动态平均节点名称都会改变) 如果我知道节点名称,我可以使用以下代码选择节点:

     SELECT extractvalue(column_value, '/row/id') 
     "id",extractvalue(column_value, '/row/name') "name"
     FROM( TABLE(XMLSequence(XMLTYPE('<root><row><id>id1</id><name>mm</name> 
     </row></root>').extract('/root/row'))))T ;

但我想选择 xmlType 中的所有节点,而不需要知道节点名称和数据到 Cursor 中

【问题讨论】:

  • 不是所有的节点都只是原始的 XML 吗?请澄清。
  • 每次我调用程序时,我都需要传递 xmlType 任何节点,将所有数据放在光标中

标签: xml oracle loops


【解决方案1】:

如果您正在寻找的是获取 xmltype 中的所有元素(所有 xml 标记?),那么您可以使用 DBMS_XMLDOM package

只是一个显示逻辑的简单示例(很可能您还需要验证子元素等):

DECLARE 
  xml_record      XMLType; 
  cntElements     integer; 
  doc             dbms_xmldom.DOMDocument;
  tagList         dbms_xmldom.DOMNodeList;
  tag             dbms_xmldom.DOMNode;

BEGIN 

 -- !!! xmltype record from a test table with one record !!!;
  select * into xml_record from xmltypes_test;

  -- get xml elements / tags
  doc     := dbms_xmldom.newDOMDocument(xml_record); 
  tagList := dbms_xmldom.getElementsByTagName(doc,'*');

  -- count tags
  cntElements:= dbms_xmldom.getlength(tagList);

  -- loop over tags
   FOR i IN 0 .. cntElements - 1
    LOOP
        tag := dbms_xmldom.item(tagList, i);
        DBMS_OUTPUT.put_line('Element ' || i || ' name: ' || dbms_xmldom.getnodename(tag) );

    END LOOP;

END;
/

希望对你有帮助

【讨论】:

    猜你喜欢
    • 2021-12-16
    • 2021-12-24
    • 2020-03-30
    • 1970-01-01
    • 2017-10-01
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    相关资源
    最近更新 更多