XML DB on Oracle10g
来源:互联网 发布:网络打假电话 编辑:程序博客网 时间:2024/06/04 18:46
在Oracle数据库基础上构建XML数据库,基本上分两种实现方式:
第一,SQL in Xml Out :
在关系数据库的基础上,通过SQL语句生成XML文档,这是在Oracle9i以前的
做法,通过DBMS_XMLQuery的包中的方法(newContext,getXML,CloseContext),把关系数据转换成XML文档输出,由于每次检索数据都会涉及到转换,所以性能损失很大,关于这方面的技术,在网上有很多资料,所以这里就不加讨论了。
第二,XMLTYPE 数据类型
在Oracle9i中提出了一种针对XML的新数据类型——XMLTYPE,用来存储,检索,更新XML数据信息,并且结合面向对象的思想,可以建立对象表,索引,约束,验证模式(Schema)。还可以与一个普通的表建立关系(外键)。
a) XMLTYPE类型
Extract(xmltype对象,XPath表达式)
返回指定路径的节点数据,包括标签
ExtractValue(xmltype对象,XPath表达式)
返回指定路径的节点的文本值,不包括标签,只限一个节点
ExistsNode(xmltype对象,XPath表达式)
测试指定的XmlType对象中是否有符合Xpath路径中的节点,返回1或0
UpdateXML(xmltype对象,XPath表达式,新值)
更新xmltype对象里的数据,根据指定的XPath路径
创建表:
Create table MyXmlTable
(
Key1 Number,
XmlColumn SYS.XMLTYPE
);
添加一条记录:
Insert into MyXmlTable (Key1,XmlColumn)
Values (1,
SYS.XMLTYPE.CREATEXML(
‘<CUSTOMER>
<CST_ID>1973</CST_ID>
<CST_NAME>FOODWORLD</CST_NAME>
<CST_TYPE>MERCHANT</CST_TYPE>
<CST_EMAIL>foodworld@foodinc.com</CST_EMAIL>
<CST_ADDR>
<CST_ADDR_STREET>18 SALISBURY ARCADE</CST_ADDR_STREET>
<CST_ADDR_CITY>TACOMA</CST_ADDR_CITY>
<CST_ADDR_STATE>WASHINGTON</CST_ADDR_STATE>
<CST_ADDR_ZIP>94682</CST_ADDR_ZIP>
<CST_ADDR_COUNTRY>USA</CST_ADDR_COUNTRY>
</CST_ADDR>
<CST_PHONE>345-879-893</CST_PHONE>
<CST_JOINDATE>1990-02-18</CST_JOINDATE>
<CST_DESCRIPTION>GROCERY MERCHANT</CST_DESCRIPTION>
</CUSTOMER>'));
检索数据:
Select XMLTYPE.Extract(XmlColumn,’/CUSTOMER/CST_NAME’)
from MyXmlTable
where ExistsNode(XmlColumn,’ /CUSTOMER[CST_ID=”1973”]’) = 1
返回 <CST_NAME>FOODWORLD</CST_NAME>
Select XMLTYPE.ExtractValue(XmlColumn,’/CUSTOMER/CST_NAME’)
from MyXmlTable
where ExistsNode(XmlColumn,’ /CUSTOMER[CST_ID=”1973”]’) = 1
返回 FOODWORLD
修改数据:
Update MyXmlTable Set XmlColumn =
UpdateXML(XmlColumn, ’/CUSTOMER/CST_NAME/text()’,’Hello,World!’)
Where where ExistsNode(XmlColumn,’ /CUSTOMER[CST_ID=”1973”]’) = 1
添加超过4k字节的xml文档到xmltype型字段,可以通过使用临时表的办法实现:
先建立一个临时的表,其中的一个字段是clob类型;再将要写入xmltype字段的xml doc写入这个临时的clob型的字段中;
最后
insert into 表名 (字段名,字段名)
values (值, sys.xmlType.createXML((select content from 临时表 where id=......)));
b) XML Schema
创建模式(XML Schema):
DECLARE
acctschema VARCHAR2(2000) :=
'<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xdb="http://xmlns.oracle.com/xdb">
<xs:complexType name="CADDRType" xdb:SQLType="XML_CADDR">
<xs:sequence>
<xs:element name="CST_ADDR_STREET" type="xs:string"/>
<xs:element name="CST_ADDR_CITY" type="xs:string"/>
<xs:element name="CST_ADDR_STATE" type="xs:string"/>
<xs:element name="CST_ADDR_ZIP" type="xs:string"/>
<xs:element name="CST_ADDR_COUNTRY" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:element name="CUSTOMER">
<xs:complexType xdb:SQLType="XML_CUSTOMER">
<xs:sequence>
<xs:element name="CST_ID" type="xs:float" nillable="false"/>
<xs:element name="CST_NAME" type="xs:string"/>
<xs:element name="CST_TYPE" type="xs:string"/>
<xs:element name="CST_EMAIL" type="xs:string"/>
<xs:element name="CST_ADDR" type="CADDRType"/>
<xs:element name="CST_PHONE" type="xs:string"/>
<xs:element name="CST_JOINDATE" type="xs:date"/>
<xs:element name="CST_DESCRIPTION" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>'
BEGIN
DBMS_XMLSCHEMA.RegisterSchema('http://localhost:8080/account.xsd', acctschema );
END;
DBMS_XMLSCHEMA.RegisterSchema(URL,xsd文本)
XDBURIType(URL) 根据指定的路径加载文本文件,返回Clob类型对象
GetClob() 将Clob类型转换为字符串
c) XMLTYPE对象表即操作
创建对象表:
CREATE TABLE demo_customers OF XMLType
XMLSCHEMA" http://localhost:8080/account.xsd"
ELEMENT "CUSTOMER"; --根元素
添加数据时需要注意:
<ACCOUNT
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation=
"http://localhost:8080/account.xsd">
添加约束:
ALTER TABLE demo_customers
ADD CONSTRAINT CSTID_IS_UNQIUE
UNIQUE (xmldata."CST_ID");
检索数据:
Select Object_value from demo_customers
创建索引:
Create Index 索引名 on demo_customers D
D.ExtractValue(’/CUSTOMER/CST_NAME’))
第一,SQL in Xml Out :
在关系数据库的基础上,通过SQL语句生成XML文档,这是在Oracle9i以前的
做法,通过DBMS_XMLQuery的包中的方法(newContext,getXML,CloseContext),把关系数据转换成XML文档输出,由于每次检索数据都会涉及到转换,所以性能损失很大,关于这方面的技术,在网上有很多资料,所以这里就不加讨论了。
第二,XMLTYPE 数据类型
在Oracle9i中提出了一种针对XML的新数据类型——XMLTYPE,用来存储,检索,更新XML数据信息,并且结合面向对象的思想,可以建立对象表,索引,约束,验证模式(Schema)。还可以与一个普通的表建立关系(外键)。
a) XMLTYPE类型
Extract(xmltype对象,XPath表达式)
返回指定路径的节点数据,包括标签
ExtractValue(xmltype对象,XPath表达式)
返回指定路径的节点的文本值,不包括标签,只限一个节点
ExistsNode(xmltype对象,XPath表达式)
测试指定的XmlType对象中是否有符合Xpath路径中的节点,返回1或0
UpdateXML(xmltype对象,XPath表达式,新值)
更新xmltype对象里的数据,根据指定的XPath路径
创建表:
Create table MyXmlTable
(
Key1 Number,
XmlColumn SYS.XMLTYPE
);
添加一条记录:
Insert into MyXmlTable (Key1,XmlColumn)
Values (1,
SYS.XMLTYPE.CREATEXML(
‘<CUSTOMER>
<CST_ID>1973</CST_ID>
<CST_NAME>FOODWORLD</CST_NAME>
<CST_TYPE>MERCHANT</CST_TYPE>
<CST_EMAIL>foodworld@foodinc.com</CST_EMAIL>
<CST_ADDR>
<CST_ADDR_STREET>18 SALISBURY ARCADE</CST_ADDR_STREET>
<CST_ADDR_CITY>TACOMA</CST_ADDR_CITY>
<CST_ADDR_STATE>WASHINGTON</CST_ADDR_STATE>
<CST_ADDR_ZIP>94682</CST_ADDR_ZIP>
<CST_ADDR_COUNTRY>USA</CST_ADDR_COUNTRY>
</CST_ADDR>
<CST_PHONE>345-879-893</CST_PHONE>
<CST_JOINDATE>1990-02-18</CST_JOINDATE>
<CST_DESCRIPTION>GROCERY MERCHANT</CST_DESCRIPTION>
</CUSTOMER>'));
检索数据:
Select XMLTYPE.Extract(XmlColumn,’/CUSTOMER/CST_NAME’)
from MyXmlTable
where ExistsNode(XmlColumn,’ /CUSTOMER[CST_ID=”1973”]’) = 1
返回 <CST_NAME>FOODWORLD</CST_NAME>
Select XMLTYPE.ExtractValue(XmlColumn,’/CUSTOMER/CST_NAME’)
from MyXmlTable
where ExistsNode(XmlColumn,’ /CUSTOMER[CST_ID=”1973”]’) = 1
返回 FOODWORLD
修改数据:
Update MyXmlTable Set XmlColumn =
UpdateXML(XmlColumn, ’/CUSTOMER/CST_NAME/text()’,’Hello,World!’)
Where where ExistsNode(XmlColumn,’ /CUSTOMER[CST_ID=”1973”]’) = 1
添加超过4k字节的xml文档到xmltype型字段,可以通过使用临时表的办法实现:
先建立一个临时的表,其中的一个字段是clob类型;再将要写入xmltype字段的xml doc写入这个临时的clob型的字段中;
最后
insert into 表名 (字段名,字段名)
values (值, sys.xmlType.createXML((select content from 临时表 where id=......)));
b) XML Schema
创建模式(XML Schema):
DECLARE
acctschema VARCHAR2(2000) :=
'<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xdb="http://xmlns.oracle.com/xdb">
<xs:complexType name="CADDRType" xdb:SQLType="XML_CADDR">
<xs:sequence>
<xs:element name="CST_ADDR_STREET" type="xs:string"/>
<xs:element name="CST_ADDR_CITY" type="xs:string"/>
<xs:element name="CST_ADDR_STATE" type="xs:string"/>
<xs:element name="CST_ADDR_ZIP" type="xs:string"/>
<xs:element name="CST_ADDR_COUNTRY" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:element name="CUSTOMER">
<xs:complexType xdb:SQLType="XML_CUSTOMER">
<xs:sequence>
<xs:element name="CST_ID" type="xs:float" nillable="false"/>
<xs:element name="CST_NAME" type="xs:string"/>
<xs:element name="CST_TYPE" type="xs:string"/>
<xs:element name="CST_EMAIL" type="xs:string"/>
<xs:element name="CST_ADDR" type="CADDRType"/>
<xs:element name="CST_PHONE" type="xs:string"/>
<xs:element name="CST_JOINDATE" type="xs:date"/>
<xs:element name="CST_DESCRIPTION" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>'
BEGIN
DBMS_XMLSCHEMA.RegisterSchema('http://localhost:8080/account.xsd', acctschema );
END;
DBMS_XMLSCHEMA.RegisterSchema(URL,xsd文本)
XDBURIType(URL) 根据指定的路径加载文本文件,返回Clob类型对象
GetClob() 将Clob类型转换为字符串
c) XMLTYPE对象表即操作
创建对象表:
CREATE TABLE demo_customers OF XMLType
XMLSCHEMA" http://localhost:8080/account.xsd"
ELEMENT "CUSTOMER"; --根元素
添加数据时需要注意:
<ACCOUNT
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation=
"http://localhost:8080/account.xsd">
添加约束:
ALTER TABLE demo_customers
ADD CONSTRAINT CSTID_IS_UNQIUE
UNIQUE (xmldata."CST_ID");
检索数据:
Select Object_value from demo_customers
创建索引:
Create Index 索引名 on demo_customers D
D.ExtractValue(’/CUSTOMER/CST_NAME’))
- XML DB on Oracle10g
- XML DB on Oracle10g
- XML DB on SQL Server2005
- uninstall Oracle10g on RHEL5
- xml db vs. RDB
- Berkeley DB XML入门
- Berkeley DB XML概览
- Oracle XML DB
- hibernate applicationContext-db.xml
- XML DB简介 oracle
- Oracle XML DB
- install mango db on ubuntu
- 解决MyEclipse 6.0 DB Explorer 连接Oracle10g数据库的问题?
- ORACLE10g RAC 修改主机名后 db instance启动不了
- oracle10g on AIX 调优笔记
- XDB: XML DB Port Assignments
- Berkeley DB XML 构架图
- Oracle XML DB 的使用
- 女生从猫猫身上学到的.........||精品||
- FastT 与EXP
- 如何转换字符串为数值- -
- 如何转换字符串为数值- -
- Oracle 获取系统日期时间,导出数据库
- XML DB on Oracle10g
- 配置SAMBA实现Solaris10与Windows间的文件共享
- OpenSource我的第二个家
- 没被中国足坛糟蹋的四大巨星
- 所谓伊人,在水一方
- 投机与投资---“智猪博弈”
- 全选
- 1.4
- 日语练习:招聘