共计 2682 个字符,预计需要花费 7 分钟才能阅读完成。
一直在做 Oracle 对 XMLType 字段的操作,我还不是 Oracle 大拿,到网上找了很多资料,但是很多就是单一功能的介绍,不能很好的解决问题,现在在这里总结下。
1、下面先创建一个名未 test.xml 的配置文件。
<?xml version=”1.0″ encoding=”UTF-8″ ?>
<collection xmlns=””>
<record>
<leader>—–nam0-22—–^^^450-</leader>
<datafield tag=”200″ ind1=”1″ ind2=” “>
<subfield code=”a”> 抗震救灾 </subfield>
<subfield code=”f”> 奥运会 </subfield>
</datafield>
<datafield tag=”209″ ind1=” ” ind2=” “>
<subfield code=”a”> 经济学 </subfield>
<subfield code=”b”> 计算机 </subfield>
<subfield code=”c”>10001</subfield>
<subfield code=”d”>2005-07-09</subfield>
</datafield>
<datafield tag=”610″ ind1=”0″ ind2=” “>
<subfield code=”a”> 计算机 </subfield>
<subfield code=”a”> 笔记本 </subfield>
</datafield>
</record>
</collection>
2、在 Oracle 中创建一个存放该 XML 文件的表:
create or replace table xmlexample(
ID varchar2(10),
name varchar2(20),
data xmltype
)
insert into xmlexample(id,name,data)
values(sys_guid(),’my document’,
xmltype
(
bfilename(filepath,filename),
nls_charset_id(‘AL32UTF8’)
)
)
其中 filepath 为文件路径,filename 为文件名。
3、extractvalue()函数的使用
Oracle 提供对 XML 文件的检索功能(extractvalue),extractvalue 只能返回一个节点的一个值,具体操作方法如下:
SQL> select id,name,
2 extractvalue(x.data,’/collection/record/leader’) as A
3 from xmlexample x;
ID NAME A
———- ——————– ———————————-
1 my document —–nam0-22—–^^^450-
如果该节点有两个值,则系统提示错误。
4、extract()函数的使用
如果想查询所有 subfield 的值就要用到 extract(),它可以返回一个节点下的所有值。操作如下
SQL> select id,name,
2 extract(x.data,’/collection/record/datafield/subfield’) as A
3 from xmlexample x;
ID NAME A
———- ——————– ———————————————————
1 my document <subfield xmlns=”” code=”a”> 抗震救灾 </subfield><subfield xmlns=”” code=”f”> 何观 …..
可以看到它返回的是 XML 格式的。如果我们想只返回它值就要是用两个函数了。
5、table 和 XMLSequence
操作如下:
SQL> select extractValue(value(i),’/subfield’) xx
2 from xmlexample x,
3 table(XMLSequence(extract(x.data,’/collection/record/datafield/subfield’))) i;
XX
——————————————————————————–
抗震救灾
何观华
经济学
计算机
10001
2005-07-09
计算几 哈哈
7 rows selected。
6、检索出特定的节点的特定值
有时候我们在实际操作的时候并不是检索出所有值,而是根据条件查询出我们所需要的信息。如果我们想检索出
<datafield tag=”209″ ind1=” ” ind2=” “>
<subfield code=”a”> 经济学 </subfield>
中的值 - 经济学
操作如下:
SQL> select id,name,
2 extractvalue(x.data,’/collection/record/datafield[@tag=”209″]/subfield[@code=”a”]’) as A
3 from xmlexample x;
ID NAME A
———- ——————– —————————
1 my document 经济学
7、总结
Oracle 对与 XMLType 的操作有很多种,还要靠大家自己去发现。数据库对 XML 的检索就是吧 XML 的节点当作一个列来检索,而不同的是表里装的是二维的数据,而 XML 中可以装 N 维。还有就是,表中列不存在就会提示无效标识符,如果节点不存在,则检索出 NULL,不会报错。所以,对与 XML 文件的操作通常是通过视图来完成。
更多 Oracle 相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-03/141676.htm