Ich verwende Oracle 11.2.0.4.0
und habe mehrere Male in Probleme ausgeführt, wenn XMLTABLE
beteiligt war. Mein letztes Problem kann mit dem folgende Beispiel demonstriert werden (was ich so einfach wie möglich sein entworfen):Seltsame Fehler mit XMLTABLE auf Oracle 11g
with data as
(
select '<A><B>B21</B></A>' x from dual
),
extractedxml as (
SELECT b
FROM data d,
xmltable('/A/B' PASSING xmltype(d.x) COLUMNS b varchar2(20) PATH '.')
)
select b from extractedxml union
select b from extractedxml;
erzeugt die folgenden Fehler:
ORA-19032: Expected XML tag , got no content
ORA-06512: at "SYS.XMLTYPE", line 310
ORA-06512: at line 1
19032. 00000 - "Expected XML tag %s got %s"
*Cause: When converting XML to object, a wrong tag name was present
*Action: Pass a valid canonical XML that can map to the given object type
während die folgende Abfrage funktioniert wie erwartet (die Klausel ist unverändert):
with data as
(
select '<A><B>B21</B></A>' x from dual
),
extractedxml as (
SELECT b
FROM data d,
xmltable('/A/B' PASSING xmltype(d.x) COLUMNS b varchar2(20) PATH '.')
)
select b from extractedxml;
B
--------------------
B21
Weiterhin ist die Abfrage funktioniert, wenn die Verwendung von XMLTABLE
vermieden:
with data as
(
select '<A><B>B21</B></A>' x from dual
),
extractedxml as (
SELECT cast (extractvalue(column_value,'B') as varchar2(20)) b
FROM data, table(xmlsequence(extract(xmltype(data.x),'/A/B')))
)
select b from extractedxml union
select b from extractedxml;
B
--------------------
B21
So habe ich einen Workaround und ich werde vermeiden, XMLTABLE
zu verwenden, solange ich das oben beschriebene Verhalten nicht verstehe. Ist XMLTABLE
als fehlerhaft zu betrachten oder fehle ich etwas?
Reproduzierbare in 11.2.0.3; auf 10.2.0.5 es core-dumps (obwohl mit dem Hinzufügen eines NO_XML_QUERY_REWRITE-Hinweises, um Bug 5963973 zu vermeiden, zeigt es auch dieses Verhalten). Sieht also wie ein Fehler aus und Sie sollten wahrscheinlich eine Serviceanfrage stellen, um es zu melden. –
Ich denke, dass es einen Fehler gibt. Wenn ich 'NVL' zu Ausdruck hinzufüge -' xmltype (NVL (d.x, ' ')) 'dann wird die Abfrage ausgeführt, aber gibt keine Zeile zurück. 'mit Daten als ( select ' B21' x von dual ), extractedxml as ( SELECT b aus Daten, d, XMLTABLE ('/ A/B' PASSING XMLType (NVL (dx ' ')) SÄULEN b varchar2 (20) PATH) ) wählen b aus extractedxml UNION b wählen von extractedxml' –
@Asieh'.': bei der Bearbeitung, dass Inline-Code Spannweiten beachten Sie bitte ('wie this') [sollte nicht zur Hervorhebung verwendet werden] (http://meta.stackoverflow.com/q/254990), nur für Code in Sätzen. Versuchen Sie außerdem, den Post so weit wie möglich zu verbessern, wenn Sie ihn bearbeiten, um die Zeit für die Rezensenten zu sparen. Vielen Dank! –