XMLTABLE und xquery verwenden, um Daten aus XML zu extrahieren

9

Ich habe das folgende Stück XML:

%Vor%

Von diesem XML möchte ich einige Daten in PL / SQL extrahieren. Ich möchte XMLTABLE verwenden, da die Funktionen EXTRACT und EXTRACTVALUE veraltet sind.

Ich kann die Daten mit dieser Abfrage extrahieren:

%Vor%

Ich verwende Platzhalter für die Namespaces, da es mir eigentlich egal ist, welche Abkürzungen die sendende Seite für den Namespace verwendet, ich kenne den genauen Pfad, wo ich meine Daten trotzdem bekommen soll.

Mit diesem Code habe ich zwei Dinge, die mich verwirren:

  • Laut der Dokumentation zu Ссылка sollte PATH jedoch optional sein Wenn ich den PATH aus dem COLUMNS-Bereich entferne, erhalte ich keine Ergebnisse mehr.

Bearbeiten:

Ich habe herausgefunden, dass es funktioniert, wenn ich die Namespaces für die Elemente entferne und sie in Großbuchstaben umwandele. Es scheint also so, als müssten die Spaltennamen mit den XML-Elementnamen übereinstimmen, damit es funktioniert. Ich habe noch nicht herausgefunden, wie man es mit namespaced XML machen kann.

  • In der Dokumentation wird außerdem darauf hingewiesen, dass "für jede resultierende Spalte außer der Spalte FOR ORDINALITY der Datentyp column angegeben werden muss", es scheint jedoch ohne es zu funktionieren. Es scheint auch ein bisschen überflüssig zu sein, es für die Spalten und für die Variablen anzugeben, in die ich die Daten hole. Irgendeine Idee, wenn ich die Datentypen nicht spezifiziere könnte mich in Schwierigkeiten bringen?

Ausführbares Codebeispiel:

%Vor%     
ErikL 29.05.2015, 11:42
quelle

2 Antworten

1

Wie bei Ihrer ersten Frage die Dokumentation, die Sie verlinkt haben , ist das heute so PATH weglassen:

  

Die optionale PATH -Klausel gibt an, dass der Teil des XQuery-Ergebnisses, der durch die XQuery-Ausdruckszeichenfolge adressiert wird, als Spalteninhalt verwendet wird.

     

Wenn Sie PATH weglassen, wird die XQuery-Ausdrucksspalte angenommen. Zum Beispiel:

     

(... COLUMNS xyz)

     

entspricht

     

XMLTable(... COLUMNS xyz PATH 'XYZ')

     

Sie können verschiedene PATH-Klauseln verwenden, um das XQuery-Ergebnis in verschiedene virtuelle Tabellenspalten aufzuteilen.

Der Grund dafür, dass die Spalte xyz als 'XYZ' angenommen wird, liegt daran, dass Oracle standardmäßig nicht zwischen Groß- und Kleinschreibung unterscheidet (standardmäßig Großbuchstaben). Wenn Sie Ihre Spalte als "aBcD" definiert haben, wird der Wert PATH als 'aBcD'

angenommen

Was Ihre zweite Frage zum Spezifizieren von Datentypen betrifft: Wenn die Daten, die Sie extrahieren, immer Textdaten sein werden, können Sie möglicherweise keinen Datentyp angeben.

Wenn Sie jedoch mit Dingen wie Daten, Zeitstempeln, Gleitkommazahlen usw. zu tun haben, können Probleme auftreten. Sie müssen sie entweder manuell mithilfe der Funktionen TO_* konvertieren oder ihre Datentypen in den Spaltendefinitionen angeben. Wenn Sie das nicht tun, ist es Oracle frei, es implizit zu verwenden, wie es sich auch anfühlt, was unerwartete Folgen haben könnte.

    
Mr. Llama 08.06.2015, 20:54
quelle
1

Referenzen:

Ссылка

Wie XML bei Verwendung von Namespace in XML (Oracle)

durch XML-Tabelle analysiert wird

Es sollte wie erwartet funktionieren, wenn Sie die Namespace-Elemente in Ihrer XML-Tabelle laden:

%Vor%

Aus Ihrem Beispiel (möglicherweise müssen Sie auch Ihr Schema / Ihren Namespace vorzeitig registrieren, aber das sollte einmal sein):

%Vor%

Dinge, die früher in früheren Versionen von Oracle funktionierten, funktionieren nicht in 11g + in Bezug auf XML. Aus dem, was ich gesehen habe, überprüft / typisiert Oracle Eingabe / Ausgabe von XML-Operationen, wo Sie in früheren Versionen normal laufen konnten ordnungsgemäße XQuery-Operationen ohne Namespace-Informationen.

    
REW 08.06.2015 20:33
quelle

Tags und Links