【问题标题】:How to Extract xmltype as xml in Oracle如何在 Oracle 中将 xmltype 提取为 xml
【发布时间】:2015-10-15 13:20:03
【问题描述】:

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

如何得到这样的输出:

  • DocumentId = 1234567
  • sFormat = E66
  • cData = &lt;Fname&gt;ABCD&lt;/Fname&gt;&lt;Lname&gt;EFGD&lt;/Lname&gt;

【问题讨论】:

  • xmlData.Extract('/main/data/text()').getStringVal() 让你 &lt;data&gt; &lt;Fname&gt;ABCD&lt;/Fname&gt; &lt;Lname&gt;EFGD&lt;/Lname&gt; &lt;/data&gt; 接近,但还不够接近 ;)
  • 想出了获得 xml 片段的方法:Extract(xmlData, '/main/data/node()').getStringVal()

标签: oracle plsql xmltype extract-value


【解决方案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;

请注意,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()');

【讨论】:

  • 在此,我们如何获取 'data' 的 clob 数据?因为我想使用一些实时的 GetClobVal() 来获取它。
【解决方案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>

【讨论】:

  • 使用 EXTRACT 函数提取 xml 值。并使用 getClobVal() 将值获取到 clob 变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-06
  • 2010-10-11
  • 2022-01-19
  • 2019-08-19
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多