千家信息网

初识Oracle的XMLType

发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,Oracle xmltype是从Oracle 9i开始支持一种新的数据类型,用于存储和管理xml数据,并提供了很多的functions,用来保存、检索和操作xml文档和管理节点。XMLType是系统定
千家信息网最后更新 2025年11月08日初识Oracle的XMLType

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 failedORA-19202: Error occurred in XML processingLPX-00210: expected '<' instead of 'a'Error at line 1zx@TEST>insert into t1 values(1,'1');1 row created.zx@TEST>col xml_data for a80zx@TEST>select * from t1;        ID XML_DATA---------- --------------------------------------------------------------------------------         1 1

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

2、查看XMLType的存储形式

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

zx@TEST>select segment_name,segment_type from user_segments;SEGMENT_NAME                   SEGMENT_TYPE------------------------------ ------------------------------------------------------T1                             TABLESYS_IL0000074607C00003$$       LOBINDEXSYS_LOB0000074607C00003$$      LOBSEGMENT

查看user_lobs是否对应xml_data列

zx@TEST>col column_name for a30zx@TEST>col table_name for a30zx@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 a30zx@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           1T1                             XML_DATA                       XMLTYPE                          NO           2T1                             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 MAXEXTENTS 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 PCTVERSION 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 DEFAULT))

3、关于XML的一些函数

1) sys.xmltype.createxml函数

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

zx@TEST>insert into t1 values(2,  2  sys.xmltype.createxml('  3    4      5      -----nam0-22-----^^^450-  6        7        抗震救灾  8         奥运会  9       10       11        经济学 12         计算机 13         10001 14         2005-07-09 15       16       17         计算机 18         笔记本 19       20     21  '));1 row created.zx@TEST>commit;Commit complete.zx@TEST>col xml_data for a80zx@TEST>select * from t1;        ID XML_DATA---------- --------------------------------------------------------------------------------         2                                        -----nam0-22-----^^^450-                                抗震救灾                 奥运会                                               经济学                 计算机                 10001                 2005-07-09                                               计算机                 笔记本                                       

2) extractvalue函数

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

zx@TEST>col data for a80zx@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--------------------------------------------------------------------------------抗震救灾奥运会经济学计算机100012005-07-09计算机笔记本

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

zx@TEST>select extract(i.xml_data,'/collection/record/datafield[@tag="610"]/subfield[@code="a"]') data from t1 i;DATA--------------------------------------------------------------------------------计算机笔记本

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                                        -----nam0-22-----^^^450-                                抗震救灾                 奥运会                                               赵旭                 计算机                 10001                 2005-07-09                                               计算机                 笔记本                                       


参考:http://blog.csdn.net/r_youxia_dayu/article/details/6686106

http://database.51cto.com/art/200911/163928.htm

http://blog.itpub.net/17203031/viewspace-708738/

官方文档:

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


计算机 数据 函数 类型 笔记 笔记本 存储 查询 抗震救灾 奥运 经济 经济学 节点 视图 面的 抗震 救灾 内容 文档 格式 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 数据库安全控制原则 通州网络安全产业园智慧园区 华为云香港服务器一年多少钱 花旗金融软件开发hc 大连8年软件开发经验 网络安全信息资产管理办法 吃鸡的服务器 SQL附加和分离数据库 网络安全知识手抄报怎么做 软件开发的优劣点 言之成网络技术有限公司怎么样 软件工程软件开发技术方向 数据库表结构 版权 星星网络安全评估的方法 文明重启发现服务器不见了 数据库技术与应用 难不难 腾讯网络安全投诉电话 北京网络安全管理中心 公司网络安全宣传视频创意短片 宋兰伟深圳软件开发 win7 网络安全选项在哪 本机设置服务器 信令管理服务器是什么意思 我的世界暗墨解说服务器多人联机 数数据库工程师考试内容 育碧服务器为什么成就不显示 大型数据库的设计通常是 0.14.2服务器 社区节前网络安全宣传 gpu编译系统软件开发工程师
0