0

我正在尝试从xmltype文档中提取 xml。

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;

如何获得这样的输出:

  • 文档编号 =1234567
  • s格式=E66
  • cData =<Fname>ABCD</Fname><Lname>EFGD</Lname>
4

2 回答 2

2

使用下面的代码。

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>
于 2015-10-15T13:41:09.297 回答
2

你可以这样做:

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;

请注意,EXTRACTVALUEEXTRACT已弃用。但是,我没有设法使用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()');
于 2015-10-15T13:43:30.273 回答