如何选择与 PLSQL 中的值匹配的子 XML?
Posted
技术标签:
【中文标题】如何选择与 PLSQL 中的值匹配的子 XML?【英文标题】:How to select a sub XML that matches a value in PLSQL? 【发布时间】:2015-07-03 04:52:40 【问题描述】:我有一些类似的 XML
<?xml version="1.0" encoding="utf-8"?>
<response>
<HEADER>some content</HEADER>
<employee><name>A</name><age>32</age><type>Permanent</type></employee>
<employee><name>B</name><age>34</age><type>Temporary</type></employee>
<employee><name>C</name><age>63</age><type>Temporary</type></employee>
<employee><name>D</name><age>64</age><type>Permanent</type></employee>
<employee><name>E</name><age>54</age><type>Permanent</type></employee>
<company><cname>Company A</cname></company>
<company><cname>Company B</cname></company>
<company><cname>Company C</cname></company>
</response>
我只想要“永久”员工详细信息和标题作为输出。类似的,
<?xml version="1.0" encoding="utf-8"?>
<response>
<HEADER>some content</HEADER>
<employee><name>A</name><age>32</age><type>Permanent</type></employee>
<employee><name>D</name><age>64</age><type>Permanent</type></employee>
<employee><name>E</name><age>54</age><type>Permanent</type></employee>
</response>
有没有办法使用 PL/SQL 获得这种类型的输出?
提前致谢。
【问题讨论】:
你打算用 PL/SQL 中的那个 o/p 做什么?我的意思是将它存储在数据库中还是什么?我不认为这不是 PL/SQL 的目的。这种处理通常用 Java 等语言完成。 【参考方案1】:declare
v_xml xmltype := xmltype('<response>
<HEADER>some content</HEADER>
<employee><name>A</name><age>32</age><type>Permanent</type></employee>
<employee><name>B</name><age>34</age><type>Temporary</type></employee>
<employee><name>C</name><age>63</age><type>Temporary</type></employee>
<employee><name>D</name><age>64</age><type>Permanent</type></employee>
<employee><name>E</name><age>54</age><type>Permanent</type></employee>
<company><cname>Company A</cname></company>
<company><cname>Company B</cname></company>
<company><cname>Company C</cname></company>
</response>');
begin
dbms_output.put_line('1) Extract only Permanent employee.');
dbms_output.put_line(v_xml.extract('//response/employee[type !="Permanent"]').getClobVal());
dbms_output.put_line(' ');
dbms_output.put_line('2) Remove unnecessary node.');
dbms_output.put_line( v_xml.deleteXML('//response/employee[type !="Permanent"]').deleteXML('//response/company').getStringVal());
end;
【讨论】:
【参考方案2】:要仅提取永久雇员,您可以使用这个简单的选择:
SELECT
xml_tab.*
FROM
XMLTABLE(
'/response/employee' PASSING XMLTYPE(q'#<?xml version="1.0" encoding="utf-8"?>
<response>
<HEADER>some content</HEADER>
<employee><name>A</name><age>32</age><type>Permanent</type></employee>
<employee><name>B</name><age>34</age><type>Temporary</type></employee>
<employee><name>C</name><age>63</age><type>Temporary</type></employee>
<employee><name>D</name><age>64</age><type>Permanent</type></employee>
<employee><name>E</name><age>54</age><type>Permanent</type></employee>
<company><cname>Company A</cname></company>
<company><cname>Company B</cname></company>
<company><cname>Company C</cname></company>
</response>#')
COLUMNS
i FOR ORDINALITY
,name VARCHAR2(100) PATH 'name'
,age VARCHAR2(3) PATH 'age'
,type VARCHAR2(100) PATH 'type'
) xml_tab
WHERE
xml_tab.type = 'Permanent';
这会产生以下输出:
I |NAME|AGE | TYPE
---------------------
1 | A | 32 | Permanent
4 | D | 64 | Permanent
5 | E | 54 | Permanent
【讨论】:
以上是关于如何选择与 PLSQL 中的值匹配的子 XML?的主要内容,如果未能解决你的问题,请参考以下文章