2013-02-28 42 views
7

Niektóre kontekst: DB jest Oracle. Próbuję utworzyć jeden rozdzielany ciąg na wiersz tabeli. Niektóre wartości rozdzielanego łańcucha muszą pochodzić z obiektów CLOB (zawierających XML). W niektórych wierszach wartości CLOB mogą mieć wartość zerową i tu leży problem.Wyodrębnij określoną wartość z CLOB (zawierającego XML) podczas tworzenia jednego rozdzielanego ciągu znaków na wiersz tabeli. Wartość CLOB może być pusta w niektórych wierszach.

Na przykład mam tabelę: "Element" z następującymi wierszami: "identyfikator_produktu", "element_CD", "element_TXT" (CLOB). Tabela ma dwa rzędy. Jeden wiersz zawiera następujący XML zapisany w "Item_TXT", drugi wiersz "Item_TXT" ma wartość null.

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

stworzyłem następujące SQL, aby powrócić pierwsze 3 elementy ograniczonej wyrażenie:

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

ten pracował z powodzeniem:

Element% # 12345% # A

Item % # 123456% # A

Następnie próbowałem dodać 4. element (wartość z CLOB).

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

ta nie powiodła się z następującym błędem:

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

mam zawężony ten problem w dół czasami Item_TXT jest nieważna i XMLType() nie może sobie z tym poradzić. Aby to udowodnić, wpadłem następujące:

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

To działało skutecznie:

Element% # 12345% # A% # test

Czy jest jakiś sposób przetworzenia całej tabeli, wydobywania wartości z CLOB jeśli jest dostępny, w przeciwnym razie dodaje zero/nic do rozdzielanego ciągu znaków?

Dziękuję za wszelką pomoc z góry :)

Odpowiedz

6

powód dla twojego błędu przy okazji jest to, że xmltype Konstruktor jest wadliwy z pustymi lobami. Osobiście zawsze używam xmltype.createxml(item_txt). okaże się, że działa równie dobrze, nie martwiąc się o nvl itp.

+0

Ah dzięki za to, bardzo przydatne !! Dziękuję Ci :) –

3

Spróbuj użyć 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

Albo można użyć CASE oświadczenie:

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

To jest ** ŚWIETNE !! ** Bardzo dziękuję, to było rozbijanie mojej głowy dzisiaj :) Demo SQLFiddle również zostało docenione! :) –