Oracle中对XMLType的简单操作(extract、extractvalue
2014-04-15 20:36
483 查看
前几天一直在做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文件的操作通常是通过视图来完成。
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的xmltype例子
- ORACLE:ORA-12154 TNS无法解析指定的连接标识符(易忽略原因)
- oracle11g如何安装及注意事项
- Oracle数据库案例整理-登录Oracle数据库失败-归档日志大小超出最大值
- Oracle数据库案例整理-登录Oracle数据库失败-非oracle用户权限不足
- Oracle数据库案例整理-登录Oracle数据库失败-审计日志目录满或不存在
- 解决在Oracle数据库中使用hibernate生成表不能正确创建表的有关问题
- Oracle数据库案例整理-登录Oracle数据库失败-表空间可用空间不足
- Oracle数据库案例整理-登录Oracle数据库失败-系统内存小于Oracle参数配置的memory_target值
- Oracle数据库案例整理-登录Oracle数据库失败-oracle用户没有添加到DBA用户组
- oracle 用 imp 导入数据 指定用户,密码,ip , 端口 和表单。
- Oracle数据库案例整理-登录Oracle数据库失败-Oracle初始化参数设置错误导致普通用户授予sysdba权限登录失败
- Oracle数据库案例整理-登录Oracle数据库失败-数据库异常关闭导致登录数据库失败
- Oracle数据库案例整理-登录Oracle数据库失败-启动进程数大于Oracle系统设置的进程数
- Oracle数据库案例整理-登录Oracle数据库失败-环境变量LIBPTAH设置错误导致登录SQLPLUS失败
- oracle 新手注意事项(转)
- Oracle数据库案例整理-启动Oracle数据库失败-时区设置错误
- ORACLE 日期加减操作
- Oracle数据库案例整理-启动Oracle数据库失败-OUTLN用户被误删除
- Oracle数据库案例整理-启动Oracle数据库失败-裸设备所属群组和文件拥有者错误