2015-10-15 6 views
0

Я пытаюсь извлечь xml из документа xmltype.Как извлечь xmltype как xml в Oracle

DECLARE 
    xmlData   XMLType; 
    sDocumentId  VARCHAR2(100); 
    sFormat   VARCHAR2(100); 
    cData   CLOB; 
BEGIN 
    xmlData := XMLType('<main> 
         <document_id>1234567</document_id> 
         <format>E66</format> 
         <data><Fname>ABCD</Fname><Lname>EFGD</Lname></data> 
        </main>'); 

    SELECT ExtractValue(xmlData, '/main/document_id/text()'), 
     ExtractValue(xmlData, '/main/format/text()'), 
     ExtractValue(xmlData, '/main/data/text()') 
    INTO sDocumentId, 
     sFormat, 
     cData 
    FROM (SELECT xmlData FROM DUAL); 

    dbms_output.put_line(sDocumentId); 
    dbms_output.put_line(sFormat); 
    dbms_output.put_line(cData); 
END; 

Как получить выход так:

  • DocumentId = 1234567
  • sFormat = E66
  • CDATA = <Fname>ABCD</Fname><Lname>EFGD</Lname>
+0

xmlData.Extract ('/ главная/данные/текст()') getStringVal() получает вас ' ABCD EFGD 'близко, но не достаточно близко;) – booyaa

+0

придумал, который сделал получить фрагмент XML:' Extract (XMLDATA, '/ главная/данные/узел()') getStringVal() ' – booyaa

ответ

1

Вы можете сделать это следующим образом:

SELECT EXTRACTVALUE(xmlData, '/main/document_id/text()'), 
    EXTRACTVALUE(xmlData, '/main/format/text()'), 
    EXTRACT(xmlData, '/main/data').GetClobVal() 
INTO sDocumentId, 
    sFormat, 
    cData 
FROM (SELECT xmlData FROM DUAL) t; 

Пожалуйста, обратите внимание, EXTRACTVALUE и EXTRACT устарели. Однако мне не удалось использовать XMLTABLE, но это может стать отправной точкой:.

SELECT * 
INTO sDocumentId, 
    sFormat, 
    cData 
FROM XMLTABLE('/main' PASSING xmlData COLUMNS 
    sDocumentId VARCHAR2(100) PATH 'document_id/text()', 
    sFormat VARCHAR2(100) PATH 'format/text()', 
    cData VARCHAR2(1000) PATH 'data/text()'); 
+0

Спасибо! РАБОТА – Prateik

+0

В этом, как мы можем получить данные clob для «данных»? Поскольку я хотел использовать что-то живое GetClobVal(), чтобы получить его. – Prateik

1

Используйте следующий код.

DECLARE 
xmlData   XMLType; 
sDocumentId  VARCHAR2(100); 
sFormat   VARCHAR2(100); 
cData   Clob; 

BEGIN 

xmlData := XMLType('<main> 
       <document_id>1234567</document_id> 
       <format>E66</format> 
       <data><Fname>ABCD</Fname><Lname>EFGD</Lname></data> 
      </main>'); 


SELECT ExtractValue(xmlData, '/main/document_id/text()'), 
     ExtractValue(xmlData, '/main/format/text()'), 
     EXTRACT(xmlData,'/main/data').getClobVal() 
INTO sDocumentId, 
     sFormat, 
     cData 
FROM (SELECT xmlData FROM DUAL); 


dbms_output.put_line(sDocumentId); 
dbms_output.put_line(sFormat); 
dbms_output.put_line(cData); 

END; 

Выход будет

1234567 
E66 
<data><Fname>ABCD</Fname><Lname>EFGD</Lname></data> 
+0

Использование ЭКСТРАКТ. функцию для извлечения значения xml. И getClobVal(), чтобы получить значение переменной clob. –

+0

Спасибо chaitanya – Prateik

Смежные вопросы