`
yunzhongxia
  • 浏览: 641308 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

数据库对象

阅读更多

     从Oracle8开始就可以在数据库中使用对象了。数据库的对象类型和Java很类似,都可以包含自己的属性和方法。属性可以存储对象的状态,方法可用于建立对象的行为模型。对象类型有时候也称为用户自定义类型。

 

     本文讲解的例子设计到三个对象类型,第一个是产品,包含产品的id、名称、说明、价格,还包含一个保质期,过期的产品必须处理掉。第二个是人,包含姓名、生日、地址。地址本身也是一个对象,地址包含街道、城市、州、邮编之类的信息。以下是三者时间的UML图。

1.创建对象类型

 

CREATE [OR REPLACE] TYPE 语句用于创建对象类型。下面的语句将创建地址类型。

 

 

CREATE OR REPLACE TYPE address_typ AS OBJECT(
       street VARCHAR2(15),
       city VARCHAR2(15),
       state VARCHAR2(15),
       zip VARCHAR2(6)
);

 

创建Person类型,注意person_typ 的address类型为address_typ。

 

CREATE OR REPLACE TYPE person_typ AS OBJECT(
       id  NUMBER,
       first_name VARCHAR2(15),
       last_name VARCHAR2(15),
       dob DATE,
       phone VARCHAR2(11),
       address address_typ
);

 

创建产品类型,注意product_typ声明了一个函数get_sell_by_date(). 这个函数根据days_valid属性和当前日期,返回产品的最晚售出日期。

CREATE OR REPLACE TYPE product_typ AS OBJECT(
       id  NUMBER,
       name VARCHAR2(15),
       description VARCHAR2(15),
       price NUMBER(5,2),
       days_valid NUMBER,
       MEMBER FUNCTION get_sell_by_date RETURN DATE
);

 

  MEMBER FUNCTION 字句用于声明get_sell_by_date()函数;MEMBER  PROCEDURE用于声明一个过程。过程与函数唯一的区别就是过程通常没有返回值。

  由于product_typ 包含了方法的声明,所以必须为product_typ 创建对象体。可以通过CREATE TYPE BODY 语句创建对象体。下面的代码为product_typ 创建对象体。注意这个对象体中get_sell_by_date()函数的定义代码。

 

CREATE OR REPLACE TYPE BODY product_typ AS
  MEMBER FUNCTION get_sell_by_date RETURN DATE IS
    v_sell_by_date DATE;
  BEGIN
    SELECT days_valid + SYSDATE INTO v_sell_by_date FROM dual;
    RETURN v_sell_by_date;
  END;
END;

 

  2.使用DESCRIBE获取有关对象类型的信息

 

   DESCRIBE命令可以用来获得对象类型的信息。下面是address_typ和 person_typ的说明。

SQL> desc address_typ;
Element Type         
------- ------------ 
STREET  VARCHAR2(15) 
CITY    VARCHAR2(15) 
STATE   VARCHAR2(15) 
ZIP     VARCHAR2(6)  
 
SQL> desc person_typ;
Element    Type         
---------- ------------ 
ID         NUMBER       
FIRST_NAME VARCHAR2(15) 
LAST_NAME  VARCHAR2(15) 
DOB        DATE         
PHONE      VARCHAR2(11) 
ADDRESS    ADDRESS_TYP  

 

SET  DESCRIBE DEPTH 可以设置DESCRIBE显示信息的深度。下面这个例子将深度改为2,然后显示person_typ的信息。

 

 

注意:SET  DESCRIBE DEPTH 必须在sql*plus中用system登录才可以执行。

 

4.用对象类型定义列对象和对象表

 

 对象类型可以用来定义表中的列,这种列称为列对象(Column Object)。同时,当对象类型包含嵌入对象类型时,嵌入对象类型也是一个列对象。person_typ就是一个例子,其中包含一个嵌入的address_typ列对象,名为address。

下面这个例子创建表products,其中包含一个product_typ列对象。注意还包含一个quantity_in_stock,表示库存的数量。

CREATE TABLE products(
       product product_typ,
       quantity_in_stock NUMBER
);

 

也可以用对象类型定义表,这个表称为对象表(Object Table).下面两句代码分别创建object_products和object_customers,分别使用product_typ和person_typ定义。注意OF字句将每个表表示为对象表。

CREATE TABLE object_products OF product_typ;
CREATE TABLE object_customers OF person_typ;

 

包含列对象的表和对象表之间的唯一区别是,前者可以含有其他列。

 

 

  对象引用与对象标识符

 

  对象表的另一个不同之处可以使用对象引用(objec reference)为对象表之间的关系建立模型,而不是外键。对象引用使用REF类型进行定义,通常都用作指向对象表中的对象的指针。对象表中的每个对象都具有惟一的对象标识符   (object identifier,OID),它可以存储在REF列中。下面这个例子创建purchases,其中包含两个REF列:

CREATE TABLE purchases(
       id NUMBER PRIMARY KEY,
       customer REF person_typ SCOPE IS object_customers,
       product REF  product_typ SCOPE IS object_products
);

 

SCOPE IS 字句将对象引用限制在特定表中的对象上,例如,customer列被限制在指向object_customers表中的对象。

 

下一篇将主要讲解对对象类型的DML操作。

 

 

  • 大小: 42 KB
  • 大小: 23.2 KB
0
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics