2015-04-21 11 views
7

Sto utilizzando Oracle 11.2.0.4.0 e ho avuto più problemi nei problemi quando era coinvolto lo XMLTABLE. Il mio ultimo problema può essere illustrato con il seguente esempio (che ho progettato per essere il più semplice possibile):Errore strano con XMLTABLE su 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; 

produce il seguente errore:

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 

mentre la seguente query funziona come previsto (la con la clausola è invariato):

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 

ulteriormente la query funziona se l'uso di XMLTABLE è evitato:

Quindi ho una soluzione alternativa e eviterò di utilizzare XMLTABLE finché non capisco il comportamento descritto sopra. È XMLTABLE essere considerato buggy o mi sto perdendo qualcosa?

+1

riproducibile in 11.2.0.3; su 10.2.0.5 core-dump (anche se con l'aggiunta di un suggerimento NO_XML_QUERY_REWRITE per evitare il bug 5963973 mostra anche questo comportamento). Quindi sembra un bug e probabilmente dovresti sollevare una richiesta di servizio per segnalarlo. –

+1

Penso che ci sia un bug. Quando aggiungo 'NVL' a expression -' xmltype (NVL (d.x, '')) 'quindi esegue la query, ma non restituisce alcuna riga. 'con i dati come ( selezionare ' B21' x da doppia ), extractedxml come ( SELEZIONA b dai dati d, XMLTable ('/ A/B' PASSAGGIO XMLType (NVL (dx , ' ')) COLONNE b varchar2 (20) PATH) ) selezionare b da extractedxml UNION selezionare b da extractedxml' –

+1

@Asieh'.': quando si modifica, si ricorda che campate codice inline ('come this') [non deve essere utilizzato per l'evidenziazione] (http://meta.stackoverflow.com/q/254990), solo per il codice nelle frasi. Inoltre, prova a migliorare il post il più possibile durante la modifica per risparmiare tempo. Grazie! –

risposta

2

Secondo la mia esperienza è una buona idea aggiungere un'ulteriore colonna per ordinalità a xmltable.

Questa istruzione SQL funziona bene:

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 i FOR ORDINALITY, b varchar2(20) PATH '.') 
) 
select b from extractedxml union 
select b from extractedxml; 

Un altro problema fatale causata dal Omissione della colonna per ordinalità:

with data as 
(
    select xmltype('<A><B>B21</B></A>') x from dual 
), 
extractedxml as (
    SELECT b 
    FROM data d, 
     xmltable('/A/B' PASSING d.x COLUMNS b varchar2(20) PATH '.') 
) 
select b from extractedxml union 
select b from extractedxml; 

>> no result (!) 

Ma

with data as 
(
    select xmltype('<A><B>B21</B></A>') x from dual 
), 
extractedxml as (
    SELECT b 
    FROM data d, 
     xmltable('/A/B' PASSING d.x COLUMNS i FOR ORDINALITY, b varchar2(20) PATH '.') 
) 
select b from extractedxml union 
select b from extractedxml; 

>> B21 
+0

Funziona (almeno per il mio caso d'uso). Grazie! – Branko