0

I am trying to extract xml from the xmltype doc.

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;

How to get the output like this:

  • DocumentId = 1234567
  • sFormat = E66
  • cData = <Fname>ABCD</Fname><Lname>EFGD</Lname>
2
  • xmlData.Extract('/main/data/text()').getStringVal() gets you <data> <Fname>ABCD</Fname> <Lname>EFGD</Lname> </data> close, but not close enough ;) Commented Oct 15, 2015 at 13:57
  • came up with which did get xml fragment: Extract(xmlData, '/main/data/node()').getStringVal() Commented Oct 15, 2015 at 15:10

2 Answers 2

2

You can do it like this:

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;

Please note, EXTRACTVALUE and EXTRACT are deprecated. However, I did not manage to use XMLTABLE, but this could be a starting point:

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()');
Sign up to request clarification or add additional context in comments.

2 Comments

In this, how can we get the clob data for 'data'? As I wanted to to use something live GetClobVal() to get it.
Can you please provide full query Including variables?
2

Use the below code.

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;

Output will be

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

2 Comments

Use EXTRACT function to extract xml value.And getClobVal() to get the value to clob variable.
How do you get this to display? Mine only says PL/SQL procedure successfully completed.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.