2013-02-28 18 views
7

Alcuni contesto: Il DB è Oracle. Sto cercando di creare una stringa delimitata per riga di una tabella. Alcuni dei valori della stringa delimitata devono provenire da CLOB (contenente XML). I CLOB possono essere nulli su alcune righe ed è qui che si trova il problema.Estrarre il valore specfic da CLOB (contenente XML) durante la creazione di una stringa delimitata per riga di una tabella. Il valore CLOB può essere nullo su alcune righe

Ad esempio, ho una tabella: "Elemento" con le seguenti righe: "Item_ID", "Item_CD", "Item_TXT" (CLOB). Il tavolo ha due righe. Una riga ha il seguente codice XML memorizzato in 'Item_TXT', l''altra stringa' Item_TXT 'è null.

<OuterTag>  
    <InnerTag>test</InnerTag> 
</OuterTag>  

ho creato il seguente SQL per restituire i primi 3 elementi della stringa delimitata:

SELECT 'Item%#'|| Item_ID ||'%#'|| Item_STAT_CD 
FROM Item; 

Questo ha funzionato con successo:

Item% # 12345% # Un

Articolo % # 123456% # A

Ho quindi provato ad aggiungere il 4 ° elemento (valore da CLOB).

SELECT 'Item%#'|| Item_ID ||'%#'|| Item_STAT_CD 
EXTRACT(XMLTYPE(Item_TXT), '//OuterTag/InnerTag/text()').getStringVal() 
FROM Item; 

questo non è riuscito con il seguente errore:

ORA-06502: PL/SQL: numeric or value error 
ORA-06512: at "SYS.XMLTYPE", line 272 
ORA-06512: at line 1 

ho ridotto questo problema fino a volte alla Item_TXT è nullo e XMLTYPE() non può gestire questa situazione. Per dimostrare questo ho eseguito il seguente:

SELECT 'Item%#'|| Item_ID ||'%#'|| Item_STAT_CD 
EXTRACT(XMLTYPE(Item_TXT), '//OuterTag/InnerTag/text()').getStringVal() 
FROM Item 
WHERE Item_TXT IS NOT NULL; 

Questo lavorato con successo:

Item% # 12345% # e% # prova

non v'è alcun modo di elaborare tutta la tabella, l'estrazione di valore da clob se disponibile, altrimenti aggiungendo null/nulla alla stringa delimitata?

Grazie per tutto l'aiuto in anticipo :)

risposta

6

la ragione per il tuo errore, a proposito, è che lo 0 Il costruttoreè imperfetto con pallonetti null. Personalmente io uso sempre xmltype.createxml(item_txt) invece. lo troverete funziona anche senza preoccuparsi di nvl ecc.

+0

Ah grazie per questo, molto utile !! Grazie :) –

3

Provare a utilizzare nvl:

SELECT 'Item%#'|| Item_ID ||'%#'|| Item_STAT_CD ||'%#'|| 
EXTRACT(XMLTYPE(nvl(Item_TXT, '<OuterTag><InnerTag/></OuterTag>')), '//OuterTag/InnerTag/text()').getStringVal() 
FROM Item; 

Here is a sqlfiddle demo

oppure è possibile utilizzare un CASE dichiarazione:

SELECT 'Item%#'|| Item_ID ||'%#'|| Item_CD||'%#'|| 
case when Item_TXT is not null then 
EXTRACT(XMLTYPE(Item_TXT), '//OuterTag/InnerTag/text()').getStringVal() end 
FROM Item; 
+0

Questo è ** GRANDE !! ** Grazie mille, mi stava rovinando la testa oggi :) La demo di SQLFiddle è stata molto apprezzata anche! :) –