2016-04-20 25 views
0

Ich versuche, ein Verfahren zu schaffen, die ein XML-Daten aus einer Tabelle liest und die Werte zu analysieren und die Werte in einer anderen Tabelle einfügenein XML-Parse dynamisch

CREATE OR replace PROCEDURE Xml_parser 
    AS 
     TYPE cur_type IS ref CURSOR; 
     vxml   XMLTYPE; 
     vvalue  VARCHAR2(100); 
     l_cur_string VARCHAR2(150); 
     vxpath  contractresignxml_master.xpath%TYPE; 
     vnodename contractresignxml_master.nodename%TYPE; 
     select_cur CUR_TYPE; 
     verror  VARCHAR2(500); 
     CURSOR cur_xml_master IS 
     SELECT xpath, 
       nodename 
     FROM xml_master; 
    BEGIN 
     SELECT xml_col 
     INTO vxml 
     FROM holds_xml; 

     OPEN cur_xml_master; 

     LOOP 
      FETCH cur_xml_master INTO vxpath, vnodename; 

      EXIT WHEN cur_xml_master%NOTFOUND; 

      L_Cur_String := 'Select e.' 
          ||Vnodename|| 
          ' From Xmltable(''/changeRequest/customerOrganisation'' Passing Xmltype(' 
          ||Vxml|| 
          ') columns ' 
          ||Vnodename|| 
          ' path ' 
          ||Vxpath|| 
          ')e'; 

    OPEN select_cur FOR l_cur_string; 

    LOOP 
     FETCH select_cur INTO vvalue; 

     EXIT WHEN select_cur%NOTFOUND; 


     dbms_output.Put_line (vnodename 
           ||' ' 
           ||vxpath 
           ||':' 
           ||vvalue); 
    END LOOP; 

    CLOSE select_cur; 
    END LOOP; 

    CLOSE cur_xml_master; 
    END; 

XPath ist der Weg des xml und nodename bezieht sich nur auf den Namen des XML-Tags. Es gibt Hunderte von xpath, für die ich den Wert in einer Variablen erhalten und in andere Tabellen einfügen möchte. vxml ist das XML, das ich analysieren möchte.

Ich versuche, eine Select-Anweisung dynamisch zu generieren, die das XML für jeden XPath analysiert, aber einen Fehler als "Fehler (27,25): PLS-00306: falsche Anzahl oder Arten von Argumenten im Aufruf von '||' "

gibt es eine andere Möglichkeit, diese

Antwort

2

die Fehler zu tun ist, weil Sie versuchen, die XMLType Variable verketten, aber die concatenation operator erlauben nur Strings (CHAR, VARCHAR2 oder CLOB). Während Sie den CLOB-Wert extrahieren können und das in Anführungszeichen eingeschlossen enthalten, ist das keine gute Idee.

Stattdessen können Sie die XMLType PL/SQL-Variable als Bindevariable übergeben. Da es sich bereits um diesen Typ handelt, muss der XMLType() Aufruf nicht in der passing Klausel stehen. Die angegebene path muss auch in Anführungszeichen gesetzt werden, wenn der Wert in Ihrer Master-Tabellenspalte noch keine Anführungszeichen enthält. So ändern Sie Ihre dynamische Aussage zu:

 L_Cur_String := 'Select e."' 
         ||Vnodename|| 
         '" From Xmltable(''/changeRequest/customerOrganisation'' ' 
         || 'Passing :xml columns "' 
         ||Vnodename|| 
         '" varchar2(200) path ''' 
         ||Vxpath|| 
         ''')e'; 

Und dann passieren die vxml Variable als :xml binden Platzhalter zu verwenden:

OPEN select_cur FOR l_cur_string USING vxml; 
+0

Das Verfahren zusammengestellt wurde. Aber während ich es ausführe, erhalte ich einen Fehler als "ORA-00902: ungültiger Datentyp". Die generierte Anweisung lautet Select EY-Coordinate Aus Xmltable ('/ changeRequest/customerOrganisation' Übergeben: xml-Spalten y-Koordinatenpfad 'changeRequest/billOfMaterials/bomSiteItem/coordinates/y-coordinate') e – Vishal5364

+0

@ Vishal5364 - der Name y-coordinate ist kein gültiger Bezeichner, daher wird ein Teil davon als Bezeichner und Teil als Datentyp interpretiert. Ich habe die dynamische Abfrage modifiziert, um den 'vnodename' in doppelten Anführungszeichen an beiden Stellen einzufügen. Beachten Sie auch, dass der Wert aus Ihrer Tabelle 30 Zeichen nicht überschreiten darf. (Idealerweise sollten Sie auch den Datentyp angeben, sonst ist der von Ihnen abgerufene Standard möglicherweise nicht geeignet und könnte später Probleme verursachen, wenn Sie den generierten Wert einfügen oder verwenden. Die Dokumentation zeigt es wie erforderlich; –

+0

Danke, ich hatte gedacht, dass es ein Problem mit der Y-Koordinate sein kann. Ich habe immer noch Probleme, nachdem ich es korrigiert habe. Wählen Sie e. "Y-Koordinate" aus Xmltable ('/ changeRequest/customerOrganisation' Übergeben: xml Spalten "y-Koordinate" Pfad 'changeRequest/billOfMaterials/bomSiteItem/Koordinaten/y-Koordinate') e es wirft Fehler "ORA-19224: XPTY0004 - XQuery static type stimmt nicht überein: expected - node() * hat - xs: string " – Vishal5364

Verwandte Themen