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’))
原创粉丝点击