Oracle Xmltype类型浅析

Oracle中,我们对于文件等复杂而且大体积的数据对象通常选择使用lob类型系列变量。Lob类型对于文件等复杂对象是一种不错的保存选择。为了实现对XML数据文件的保存支持和操作支持,Oracle提供了数据类型xmltype作为XML数据的特殊存储类型。Xmltype提供了适合的保存、检索和操作的支持,本篇就简单介绍一下xmltype的一些特性。

1、xml格式使用

定义一个xmltype数据列表同一般的数据列没有过多的差异。我们选择Oracle 10gR2作为实验环境。

SQL> select * from v$version;

BANNER

----------------------------------------------------------------

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod

PL/SQL Release 10.2.0.1.0 - Production

CORE    10.2.0.1.0      Production

TNS for 32-bit Windows: Version 10.2.0.1.0 - Production

NLSRTL Version 10.2.0.1.0 – Production

我们可以将数据列定义为xmltype上,xmltype在Oracle 10g中是作为专门的保存XML格式。

SQL> create table t (id number, cl xmltype);

Table created

SQL> desc t;

Name Type    Nullable Default Comments

---- ------- -------- ------- --------

ID  NUMBER  Y                       

CL  XMLTYPE Y             

数据字段定义为xmltype之后,在进行数据保存过程中都会进行格式检查,当不合乎XML通用规则数据尝试保存入系统时,Oracle都会报错。

SQL> insert into t values (1,'ddd');

insert into t values (1,'ddd')

ORA-31011: XML 语法分析失败

ORA-19202: XML 处理

LPX-00210: 预期为 '<'而不是 'd'

Error at line 1

时出错

SQL> insert into t values (1,'ddd');

1 row inserted

SQL> commit;

Commit complete

SQL> select * from t;

ID CL

---------- --------------------------------------------------------------------------------

1 ddd

可见,对于不合乎基本XML格式的数据,Oracle是不允许进行保存的。

2、XMLTYPE与LOB

Xmltype字段的是可以容纳入XML格式文件,那么该类型字段的本质是什么呢?

SQL> select segment_name, segment_type, tablespace_name from user_segments;

SEGMENT_NAME                  SEGMENT_TYPE      TABLESPACE_NAME

------------------------------ ------------------ ------------------------------

SYS_LOB0000056127C00003$$      LOBSEGMENT        USERS

T                              TABLE                USERS

SYS_IL0000056127C00003$$      LOBINDEX          USERS

9 rows selected

SQL> select table_name, column_name,SEGMENT_NAME, TABLESPACE_NAME, INDEX_NAME from user_lobs;

TABLE_NAME COLUMN_NAME          SEGMENT_NAME                  TABLESPACE INDEX_NAME

---------- -------------------- ------------------------------ ---------- ------------------------------

T          SYS_NC00003$        SYS_LOB0000056127C00003$$      USERS      SYS_IL0000056127C00003$$

我们发现,数据表T中多出了一个Lob数据段和Lob索引段,这个特性与LOB类型数据特性相同。值得关注的是在user_lobs中,显示的column_name是一个未知的名称“SYS_NC00003$”。那么我们就继续从这个线索入手。

我们需要检查一下基础元数据表信息。

SQL> select object_id, data_object_id from dba_objects where wner='SCOTT' and object_name='T';

OBJECT_ID DATA_OBJECT_ID

---------- --------------

56136          56139

SQL> select col#, segcol#, segcollength, name, type#,charsetform. from col$ where obj#=56136;

COL#    SEGCOL# SEGCOLLENGTH NAME                      TYPE# CHARSETFORM

---------- ---------- ------------ -------------------- ---------- -----------

1          1          22 ID                            2          0

2          0        2000 CL                          58          0

2          2        4000 SYS_NC00003$                112          1

对SYS_NC00003$列,我们根据charsetform字段的取值,可以确定具体类型。

//片段来自dba_tab_cols视图定义;

112, decode(c.charsetform, 2, 'NCLOB', 'CLOB'),

由此,我们可以基本猜想出xmltype的结构类型。作为xmltype,Oracle会在数据表上建立一个clob类型的系统列,用于协助保存数据。

3、数据表定义

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/a0c5ade15cbbb76ae0714ce921f34bd6.html