千家信息网

初识Oracle的XMLType

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,Oracle xmltype是从Oracle 9i开始支持一种新的数据类型,用于存储和管理xml数据,并提供了很多的functions,用来保存、检索和操作xml文档和管理节点。XMLType是系统定
千家信息网最后更新 2025年02月01日初识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安全错误 数据库的锁怎样保障安全 扬中网络安全 服务器上抢红包插件怎么做的 荣耀路由器改打印服务器 上海万天网络技术有限公司 数据库和分布式分析系统 打开数据库时应打开什么文件 数据库中主键的取值 数据库如何修改mdf文件名 机关开展网络安全大检查 智慧照明网络安全隐患 网络安全设备市场开发 下列哪种是流行的数据库技术 addal数据库集群 简单的登录数据库 重庆小金牛网络技术 服务器储存配置怎么看 服务器一直正在运行怎么办 针对个人网络安全服务的公司 张掖斑马互联网科技有限公司 数据库原理张老师 大唐国际网络安全八条禁令是什么 软件开发用什么软件开发 android图片保存到服务器 大华dss服务器所有服务不启动 服务器应用程序哪个好 网站后台数据库设计思路 网络安全靠大家手抄报格式 上海前端软件开发价格 招聘网站模板 数据库 dong10网络技术公司
0