如何在 Oracle 中将 xml 类型提取为 xml

How to Extract xmltype as xml in Oracle

我正在尝试从 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;

如何得到这样的输出:

使用下面的代码。

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>

你可以这样做:

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()');