sql >> Base de Datos >  >> RDS >> Oracle

Recuperar el valor de un elemento xml en Oracle PL SQL

Necesitas cambiar la línea

testr := DBMS_XMLDOM.getNodeName(n) || ' ' || DBMS_XMLDOM.getNodeValue(n);

a

testr := DBMS_XMLDOM.getNodeName(n) || ' ' || DBMS_XMLDOM.getNodeValue(DBMS_XMLDOM.getFirstChild(n));

En XML DOM, los elementos no tienen ningún "valor" del que hablar. Los nodos de elemento contienen nodos de texto como elementos secundarios, y son estos nodos los que contienen los valores que desea.

EDITAR (en respuesta al comentario de Tomalak):no conozco ninguna función en DBMS_XMLDOM para obtener el valor combinado de todos los nodos de texto secundarios de un elemento. Si eso es lo que necesita, es posible que deba usar algo como la siguiente función:

CREATE OR REPLACE FUNCTION f_get_text_content (
    p_node          DBMS_XMLDOM.DOMNode
) RETURN VARCHAR2
AS
  l_children        DBMS_XMLDOM.DOMNodeList;
  l_child           DBMS_XMLDOM.DOMNode;
  l_text_content    VARCHAR2(32767);
  l_length          INTEGER;
BEGIN
  l_children := DBMS_XMLDOM.GetChildNodes(p_node);
  l_length := DBMS_XMLDOM.GetLength(l_children);
  FOR i IN 0 .. l_length - 1 LOOP
    l_child := DBMS_XMLDOM.Item(l_children, i);
    IF DBMS_XMLDOM.GetNodeType(l_child) IN (DBMS_XMLDOM.TEXT_NODE, DBMS_XMLDOM.CDATA_SECTION_NODE) THEN
      l_text_content := l_text_content || DBMS_XMLDOM.GetNodeValue(l_child);
    END IF;
  END LOOP;
  RETURN l_text_content;
END f_get_text_content;
/