Announcement

Collapse
No announcement yet.

"for each node" in plsql

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • "for each node" in plsql

    Hallo zusammen!

    Ich möchte eine Abfrage starten, mit der ich Folgendes mache:

    In einer Tabelle XML_Tabelle ist eine XML Datei als ein CLOB hinterlegt, die z.B. so aussieht:

    Code:
    <table>
      <header>
        <column columnnumber="1">Überschrift</column>
        <column columnnumber="2">Überschrift</column>
        ...
      </header>
      <rows>
        <row>
          <entry columnnumber="2">Inhalt der Zelle</entry>
          <indikator value="Name">Inhalt der Zelle</indikator>
          ...
        </row>
        <row>
          <entry columnnumber="3">Inhalt der Zelle</entry>
          <indikator value="Vorname">Inhalt der Zelle</indikator>
          ...
        </row>
        ...
      </rows>
    </table>
    Was ich machen möchte, ist wahrscheinlich einen "loop" starten und mit dem jeden "row" in dieser XML Datei durchgehen(das ist schon das Wesentliche!) und dabei den "Inhalt der Zelle" für den Knoten "indikator" auslesen. Je nach Inhalt werden unterschiedliche Befehle gestartet...

    Bin sehr dankbar für jeden Tipp!

    Grüße
    Alex

  • #2
    Hast Du fast das selbe nicht im Thread xml to oracle gefragt und die Antwort bekommen ?

    Comment


    • #3
      Es ist das gleiche Thema, aber es geht um "loop" hier. Wie kann ich jeden Knoten aufrufen?

      In xslt würde es so ähnlich wie:

      for-each select="//row"

      abgefragt werden. Den Rest hast du und andere bereits beantwortet.

      Vielen Dank!

      Comment


      • #4
        Das Abrufen der Knoten "indikator" erfolgt ganz analog zum anderen Thread:
        Code:
        WITH xml_data AS 
        (SELECT
          XMLTYPE ('
        <table>
          <header>
            <column columnnumber="1">Überschrift</column>
            <column columnnumber="2">Überschrift</column>
            ...
          </header>
          <rows>
            <row>
              <entry columnnumber="2">Inhalt der Zelle</entry>
              <indikator value="Name">Inhalt der Zelle 2</indikator>
              ...
            </row>
            <row>
              <entry columnnumber="3">Inhalt der Zelle</entry>
              <indikator value="Vorname">Inhalt der Zelle 3</indikator>
              ...
            </row>
            ...
          </rows>
        </table>') xd FROM dual
        )
        SELECT  extractValue(column_value, '//indikator/@value') val,
                extractValue(column_value, '//indikator') inhalt
          FROM xml_data,  TABLE(XMLSequence(extract(xd,'//row'))); 
        
        VAL        INAHLT
        ------------------------------
        Name       Inhalt der Zelle 2
        Vorname    Inhalt der Zelle 3
        Das ist doch aber sicher nicht das Problem ?
        Zuletzt editiert von jum; 11.05.2010, 11:39.

        Comment


        • #5
          Hallo jum,

          das ist leider nicht das Problem. Das hattest du ja schon gezeigt.

          Was ich erreichen möchte: Es gibt zahlreiche Knoten "row". Die alle haben weitere Unterknoten. Ich möchte diese alle durchgehen und entsprechend handeln. So ähnlich wie:

          Schau in /*/row[position()=1]/indikator
          Wenn der Wert von indicator "bla" mach "dies" (das hast du schon gezeigt)
          Wenn der Wert von indicator "blub" mach "das" (das hast du schon gezeigt)

          Schau in /*/row[position()=2]/indikator
          Wenn der Wert von indicator "bla" mach "dies" (das hast du schon gezeigt)
          Wenn der Wert von indicator "blub" mach "das" (das hast du schon gezeigt)

          Und das solange bis man in allen Knoten "row" nachgesehen hat.

          Es geht jetzt nur um die rotmarkierte Zeile. Ich brauche eine Schleife, mit der ich alle Knoten mit dem Namen "row" der gleichen Prozedur unterziehe.

          Comment


          • #6
            - ich verstehe leider gerade die Problematik nicht

            Comment


            • #7
              Die Frage ist wahrscheinlich wieder zu leicht für dich, aber ich bin wirklich ein totaler Anfänger.

              Wie realisiere ich diese Abfrage/Schleife in PL/SQL?

              Nach dem, was ich bis jetzt gefunden habe, müsste ich sowas wie
              Code:
              For x In 1 .. 10 Loop
                  -- Procedure ausführen
              End Loop;
              machen. Oder?

              Und abhängig von dem Resultat aus dem "indikator" würde wahrscheinlich jeweils ein Fall (case) aufgerufen werden...

              Comment


              • #8
                Dann musst Du die Abfrage in eine FOR-LOOP einbauen, z.B. über einen CURSOR, hier ein funkriionsfähiges Beispiel:

                Vorbereitung:
                Code:
                SET SERVEROUTPUT ON SIZE 1000000;
                
                --Test-Tabelle ggf. droppen
                DROP   TABLE test_158;
                
                --XMLType Test-Tabelle bauen
                CREATE TABLE test_158 AS
                 (SELECT XMLTYPE ('
                      <table>
                        <header>
                          <column columnnumber="1">Überschrift</column>
                          <column columnnumber="2">Überschrift</column>
                        </header>
                        <rows>
                          <row>
                            <entry columnnumber="2">Inhalt der Zelle</entry>
                            <indikator value="Name">Inhalt der Zelle 2</indikator>
                          </row>
                          <row>
                            <entry columnnumber="3">Inhalt der Zelle</entry>
                            <indikator value="Vorname">Inhalt der Zelle 3</indikator>
                          </row>
                      </rows>
                    </table>') xd FROM dual); 
                
                --Tabelle abfragen
                SELECT extractValue(column_value, '//indikator') inhalt
                       FROM test_158, TABLE(XMLSequence(extract(xd,'//row')));
                
                INHALT                                                                          
                --------------------------------------------------------------------------------
                Inhalt der Zelle 2                                                              
                Inhalt der Zelle 3
                Code:
                DECLARE 
                
                  --Variable für INDIKATOR-Wert
                  indVal VARCHAR2(2000);
                
                   --CURSOR deklarieren, analog zur Abfrage
                  CURSOR valCurs IS  
                     SELECT extractValue(column_value, '//indikator') inhalt
                       FROM test_158, TABLE(XMLSequence(extract(xd,'//row')));
                
                BEGIN
                  --Cursor öffnen
                  OPEN valCurs;
                  LOOP
                    --Cursor durchlaufen
                    FETCH valCurs INTO indVal;
                    --Schleife ggf. verlassen
                    EXIT WHEN valCurs%NOTFOUND;
                    --hier irgendetwas in Abhängigkeit vom Wert tun
                    DBMS_OUTPUT.PUT_LINE( indVal ); 
                  END LOOP;
                  --Cursor wieder schliessen
                  CLOSE valCurs;
                END;
                
                Inhalt der Zelle 2
                Inhalt der Zelle 3
                Zuletzt editiert von jum; 12.05.2010, 08:22.

                Comment


                • #9
                  Hallo!

                  Vielen Dank! Damit kann ich auf jeden Fall basteln. Eine Frage noch:

                  Abhängig vom Ergebnis der Abfrage, soll ein anderer Knoten in der bereits erwähnten XML Datei ausgelesen werden. Was ich z.B. so machen kann:
                  Code:
                  SELECT extractValue(column_value, '//indikator')
                  Jetzt besteht die Möglichkeit bestimmte Knoten explizit anzusprechen über:
                  Code:
                  SELECT extractValue(column_value, '//indikator[position()=1]')
                  Wenn ich aber statt der "1" eine Laufvariable verwenden möchte klappt das nicht. Ich würde z.B. eine Variable a vom Typ number mit im Loop haben und jedes mal einen höheren Knoten ansprechen. Folgendes geht aber nicht:
                  Code:
                  SELECT extractValue(column_value, '//indikator[position()=a]')
                  Was stimmt da nicht?

                  Comment


                  • #10
                    Das ginge z.B. nach folgendem Muster (in_dyn):
                    Code:
                    SELECT extractvalue(xd,'//*[@columnnumber=   2   ]') in_stat,
                           extractvalue(xd,'//*[@columnnumber='||3||']') in_dyn  
                    FROM
                    (SELECT XMLTYPE ('
                          <table>
                            <header>
                              <column columnnumber="0">Überschrift</column>
                            </header>
                              <row>
                                <entry columnnumber="1">1001</entry>
                                <indikator value="Name">Inhalt der Zelle 2</indikator>
                              </row>
                            <rows>
                              <row>
                                <entry columnnumber="2">1002</entry>
                                <indikator value="Name">Inhalt der Zelle 2</indikator>
                              </row>
                              <row>
                                <entry columnnumber="3">1003</entry>
                                <indikator value="Vorname">Inhalt der Zelle 3</indikator>
                              </row>
                          </rows>
                        </table>') xd FROM dual)
                    
                    IN_STAT   IN_DYN                                                                          
                    -------------------------------------
                    1002        1003
                    Es gibt noch andere Varianten, die XPath-Ausdrücke sind sehr mächtig...

                    Comment


                    • #11
                      Hallo jum,

                      größten Dank für die schnelle Antwort! Werde versuchen diese umzusetzen!

                      Grüße
                      Alex

                      Comment

                      Working...
                      X