阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

初识Oracle的XMLType

543次阅读
没有评论

共计 8124 个字符,预计需要花费 21 分钟才能阅读完成。

Oracle xmltype 是从 Oracle 9i 开始支持一种新的数据类型,用于存储和管理 xml 数据,并提供了很多的 functions,用来保存、检索和操作 xml 文档和管理节点。XMLType 是系统定义的类型,所以可以使用它作为一个函数的参数或表或视图中的列的数据类型。也可以创建表和视图的 XMLType。当你创建一个表中的一个 XMLType 列,你可以选择 XML 数据存储在一个 CLOB 列,作为二进制 XML(内部存储为 CLOB),或对象的关系。

下面将介绍 Oracle XMLType 的一些基本使用。

1、创建一个包含 XMLType 类型列的表,并插入测试数据

zx@TEST>create table t1 (id number,xml_data sys.xmltype);
 
Table created.
 
zx@TEST>desc t1
 Name                                                    Null? Type
 —————————————————————————————————– ——– ——————————————————————–
 ID                                                        NUMBER
 XML_DATA                                                  SYS.XMLTYPE
 
 zx@TEST>insert into t1 values(1,’abc’);
insert into t1 values(1,’abc’)
            *
ERROR at line 1:
ORA-31011: XML parsing failed
ORA-19202: Error occurred in XML processing
LPX-00210: expected ‘<‘ instead of ‘a’
Error at line 1
 
zx@TEST>insert into t1 values(1,'<abc>1</abc>’);
 
1 row created.
 
zx@TEST>col xml_data for a80
zx@TEST>select * from t1;
 
    ID XML_DATA
———- ——————————————————————————–
    1 <abc>1</abc>

从上面看出,XMLType 可以做为列中列的数据类型,在插入数据时必须符合 XML 格式才能插入,否则会报错。

2、查看 XMLType 的存储形式

从 user_segments 视图中看出 XMLType 列是以 LOB 字段存储的

zx@TEST>select segment_name,segment_type from user_segments;
 
SEGMENT_NAME              SEGMENT_TYPE
—————————— ——————————————————
T1                TABLE
SYS_IL0000074607C00003$$      LOBINDEX
SYS_LOB0000074607C00003$$      LOBSEGMENT

查看 user_lobs 是否对应 xml_data 列

zx@TEST>col column_name for a30
zx@TEST>col table_name for a30
zx@TEST>select table_name,column_name,segment_name from user_lobs;
 
TABLE_NAME            COLUMN_NAME            SEGMENT_NAME
—————————— —————————— ——————————
T1                SYS_NC00003$            SYS_LOB0000074607C00003$$

从上面的查询结果可以看到 LOBSEGMENT 对应的表 T1 中的列 SYS_NC00003$,而不是 XML_DATA 列,而且表 T1 中没有这个列,再次查询 user_tab_cols 视图

zx@TEST>col data_type for a30
zx@TEST>select TABLE_NAME,COLUMN_NAME,DATA_TYPE,HIDDEN_COLUMN,COLUMN_ID from user_tab_cols;
 
TABLE_NAME            COLUMN_NAME            DATA_TYPE          HIDDEN_CO COLUMN_ID
—————————— —————————— —————————— ——— ———-
T1                ID                  NUMBER              NO      1
T1                XML_DATA              XMLTYPE              NO      2
T1                SYS_NC00003$            CLOB                YES      2

从上面的查询中可以看出列 SYS_NC00003$ 是表 T1 中的隐藏列,它与列 XML_DATA 列的 COLUMN_ID 都是 2,说明它们是同一列。由此可以看出 XMLType 类型的数据由 CLOB 类型列协助保存。由下面的表定义也可以推断出这一点:

zx@TEST>select dbms_metadata.get_ddl(‘TABLE’,’T1′,USER) from dual;
 
DBMS_METADATA.GET_DDL(‘TABLE’,’T1′,USER)
——————————————————————————–
 
  CREATE TABLE “ZX”.”T1″
  (“ID” NUMBER,
    “XML_DATA” “SYS”.”XMLTYPE”
  ) SEGMENT CREATION IMMEDIATE
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENT
S 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT
 FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE “USERS”
 XMLTYPE COLUMN “XML_DATA” STORE AS BASICFILE CLOB (
  TABLESPACE “USERS” ENABLE STORAGE IN ROW CHUNK 8192 PCTVER
SION 10
  NOCACHE LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL
 DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAUL
T))

3、关于 XML 的一些函数

1) sys.xmltype.createxml 函数

使用 sys.xmltype.createxml 创建 XMLType 类型的数据

  1zx@TEST>insert into t1 values(2,
  2  sys.xmltype.createxml(‘<?xml version=”1.0″ encoding=”UTF-8″ ?>
  3  <collection xmlns=””>
  4    <record>
  5      <leader>—–nam0-22—–^^^450-</leader>
  6      <datafield tag=”200″ ind1=”1″ ind2=” “>
  7        <subfield code=”a”> 抗震救灾 </subfield>
  8        <subfield code=”f”> 奥运会 </subfield>
  9      </datafield>
 10      <datafield tag=”209″ ind1=” ” ind2=” “>
 11        <subfield code=”a”> 经济学 </subfield>
 12        <subfield code=”b”> 计算机 </subfield>
 13        <subfield code=”c”>10001</subfield>
 14        <subfield code=”d”>2005-07-09</subfield>
 15      </datafield>
 16      <datafield tag=”610″ ind1=”0″ ind2=” “>
 17        <subfield code=”a”> 计算机 </subfield>
 18        <subfield code=”a”> 笔记本 </subfield>
 19      </datafield>
 20    </record>
 21  </collection>’));
 
1 row created.
zx@TEST>commit;
 
Commit complete.
 
zx@TEST>col xml_data for a80
zx@TEST>select * from t1;
 
        ID XML_DATA
———- ——————————————————————————–
        2 <?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) extractvalue 函数

extractvalue 函数提供对 XML 文件的检索功能只能返回一个节点的一个值,如果该节点有多个值,则系统提示错误。

zx@TEST>col data for a80
zx@TEST>select extractvalue(i.xml_data,’/collection/record/leader’) data from t1 i;
 
DATA
——————————————————————————–
—–nam0-22—–^^^450-
 
zx@TEST>select extractvalue(i.xml_data,’/collection/record/datafield’) data from t1 i;
select extractvalue(i.xml_data,’/collection/record/datafield’) data from t1 i
                                                                        *
ERROR at line 1:
ORA-19025: EXTRACTVALUE returns value of only one node

3) extract 函数

extract 函数查询 XMLType 的内容,它可以返回一个节点下的所有值。它返回的是 XML 格式的。

zx@TEST>select extract(i.xml_data,’/collection/record/datafield/subfield’) data from t1 i;
 
DATA
——————————————————————————–
<subfield xmlns=”” code=”a”> 抗震救灾 </subfield><subfield xmlns=”” code=”f”> 奥运
会 </subfield><subfield xmlns=”” code=”a”> 经济学 </subfield><subfield xmlns=”” cod
e=”b”> 计算机 </subfield><subfield xmlns=”” code=”c”>10001</subfield><subfield xml
ns=”” code=”d”>2005-07-09</subfield><subfield xmlns=”” code=”a”> 计算机 </subfield
><subfield xmlns=”” code=”a”> 笔记本 </subfield>

查询 tag=”610″,且 code=”a” 所对应的值

zx@TEST>select extract(i.xml_data,’/collection/record/datafield[@tag=”610″]/subfield[@code=”a”]’) data from t1 i;
 
DATA
——————————————————————————–
<subfield xmlns=”” code=”a”> 计算机 </subfield><subfield xmlns=”” code=”a”> 笔记本 <
/subfield>

4) table 和 XMLSequence

如果只想返回它值就要是用上面的两个函数了。

 zx@TEST>select extractvalue(value(i),’/subfield’) data
  2  from t1 x,
  3  table(xmlsequence(extract(x.xml_data,’/collection/record/datafield[@tag=”610″]/subfield[@code=”a”]’))) i;
 
DATA
——————————————————————————–
计算机
笔记本

4) updatexml

使用 updatexml 更新 XMLType 里的内容,把 tag=”209″、code=”a” 的经济学修改为“赵旭”

zx@TEST>update t1 set xml_data=
  2  updatexml(xml_data,’/collection/record/datafield[@tag=”209″]/subfield[@code=”a”]/text()’,’ 赵旭 ’);
 
1 row updated.
 
zx@TEST>select * from t1;
 
        ID XML_DATA
———- ——————————————————————————–
        2 <?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>

参考:

http://www.linuxidc.com/Linux/2017-03/141676.htm

http://www.linuxidc.com/Linux/2017-03/141677.htm

http://www.linuxidc.com/Linux/2017-03/141678.htm

官方文档:

http://docs.oracle.com/cd/E11882_01/appdev.112/e40758/t_xml.htm#ARPLS369

http://docs.oracle.com/cd/E11882_01/server.112/e41084/functions225.htm#SQLRF06172

http://docs.oracle.com/cd/E11882_01/server.112/e41084/functions060.htm#SQLRF00640

http://docs.oracle.com/cd/E11882_01/server.112/e41084/functions061.htm#SQLRF06173

更多 Oracle 相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-03/141675.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计8124字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19348
评论数
4
阅读量
7802105
文章搜索
热门文章
开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南 大家好,我是星哥。之前介绍了腾讯云的 Code...
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板 1Panel:小白轻松构建 Web 服务与面板加固指南 哈喽,我是星哥,经常有人问我不...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

  星哥带你玩飞牛 NAS-16:飞牛云 NAS 换桌面,fndesk 图标管理神器上线! 引言 哈...
星哥带你玩飞牛NAS-11:咪咕视频订阅部署全攻略

星哥带你玩飞牛NAS-11:咪咕视频订阅部署全攻略

星哥带你玩飞牛 NAS-11:咪咕视频订阅部署全攻略 前言 在家庭影音系统里,NAS 不仅是存储中心,更是内容...
你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你 为什么要用宝塔跑分? 宝塔跑分其实就是对 CPU、内存、磁盘、IO 做...
云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板 1Panel:小白轻松构建 Web 服务与面板加固指南 哈喽,我是星哥,经常有人问我不...
Prometheus:监控系统的部署与指标收集

Prometheus:监控系统的部署与指标收集

Prometheus:监控系统的部署与指标收集 在云原生体系中,Prometheus 已成为最主流的监控与报警...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
安装并使用谷歌AI编程工具Antigravity(亲测有效)

安装并使用谷歌AI编程工具Antigravity(亲测有效)

  安装并使用谷歌 AI 编程工具 Antigravity(亲测有效) 引言 Antigravity...
星哥带你玩飞牛NAS-16:不再错过公众号更新,飞牛NAS搭建RSS

星哥带你玩飞牛NAS-16:不再错过公众号更新,飞牛NAS搭建RSS

  星哥带你玩飞牛 NAS-16:不再错过公众号更新,飞牛 NAS 搭建 RSS 对于经常关注多个微...
每年0.99刀,拿下你的第一个顶级域名,详细注册使用

每年0.99刀,拿下你的第一个顶级域名,详细注册使用

每年 0.99 刀,拿下你的第一个顶级域名,详细注册使用 前言 作为长期折腾云服务、域名建站的老玩家,星哥一直...
你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你 为什么要用宝塔跑分? 宝塔跑分其实就是对 CPU、内存、磁盘、IO 做...
星哥带你玩飞牛NAS-12:开源笔记的进化之路,效率玩家的新选择

星哥带你玩飞牛NAS-12:开源笔记的进化之路,效率玩家的新选择

星哥带你玩飞牛 NAS-12:开源笔记的进化之路,效率玩家的新选择 前言 如何高效管理知识与笔记,已经成为技术...