sql >> Database teknologi >  >> RDS >> Oracle

Hent værdien af ​​et xml-element i Oracle PL SQL

Du skal ændre linjen

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

til

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

I XML DOM har elementer ikke nogen 'værdi' at tale om. Elementnoder indeholder tekstnoder som børn, og det er disse noder, der indeholder de værdier, du ønsker.

EDIT (som svar på Tomalaks kommentar):Jeg er ikke bekendt med nogen funktioner i DBMS_XMLDOM til at opnå den kombinerede værdi af alle underordnede tekstnoder i et element. Hvis det er det, du har brug for, så skal du muligvis bruge noget i stil med følgende funktion:

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;
/


  1. Forsøger at få de faktiske data, der forårsager en undtagelse

  2. TransactSQL for at køre et andet TransactSQL-script

  3. PostgreSQL Upsert differentiere indsatte og opdaterede rækker ved hjælp af systemkolonner XMIN, XMAX og andre

  4. PG::Fejl:FEJL:ugyldig bytesekvens til kodning af UTF8:0xfc