125.Oracle数据库SQL开发之 数据库对象——数据库中使用对象类型

欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/50087049

如何在数据库表中使用这些类型。可以使用对象类型定义表中单个的列,随后存储在此列中的对象称为列对象(column object)。也可以使用对象类型定义表中的一整行,然后此表称为对象表。可以使用对象引用(object reference)来访问对象表中单独的行。

1.  列对象

创建一个名为products 的表,包含一列product,该列的类型为t_product.

如下:

CREATE TABLE products (

  product           t_product,

 quantity_in_stock INTEGER

);

插入如下:

INSERT INTO products (

  product,

 quantity_in_stock

) VALUES (

  t_product(1,'pasta', '20 oz bag of pasta', 3.95, 10),

  50

);

其中t_product(1, 'pasta', '20 oz bag of pasta', 3.95, 10) 是构造函数。

查询如下:

object_user@PDB1> select * from products;

 

PRODUCT(ID, NAME, DESCRIPTION, PRICE,DAYS_VALID)

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

QUANTITY_IN_STOCK

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

T_PRODUCT(1, 'pasta', '20 oz bag of pasta',3.95, 10)

                50

 

T_PRODUCT(2, 'sardines', '12 oz box ofsardines', 2.99, 5)

                25

T_product对象类型中包含get_sell_by_date函数,用于计算并返回某件产品的最晚售出时间。

执行如下:

object_user@PDB1> selectp.product.get_sell_by_date() from products p;

 

P.PRODUCT

---------

05-DEC-15

30-NOV-15

2.  对象表

可以使用对象类型来定义整个表,这样一个表称为对象表。

创建一个object_products的对象表,存储t_product类型的对象。

CREATE TABLE object_products OF t_product;

插入如下:

INSERT INTO object_products VALUES (

  t_product(1,'pasta', '20 oz bag of pasta', 3.95, 10)

);

INSERT INTO object_products (

  id, name,description, price, days_valid

) VALUES (

  2,'sardines', '12 oz box of sardines', 2.99, 5

);

查询如下:

object_user@PDB1> select * from object_products;

 

         IDNAME       DESCRIPTION                PRICE DAYS_VALID

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

          1 pasta     20 oz bag of pasta    3.95 10

          2 sardines  12 oz box of sardines          2.99  5

ORACLE数据库内置的VALUE函数从对象表中查询记录。

执行如下:

object_user@PDB1> select value(op) fromobject_products op;

 

VALUE(OP)(ID, NAME, DESCRIPTION, PRICE,DAYS_VALID)

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

T_PRODUCT(1, 'pasta', '20 oz bag of pasta',3.95, 10)

T_PRODUCT(2, 'sardines', '12 oz box ofsardines', 2.99, 5)

3.  对象标识符和对象引用

对象表中的每个对象都具有唯一的对象标记符(OID),可以使用REF函数检索对象的OID。

执行如下:

object_user@PDB1> select ref(oc) fromobject_customers oc where oc.id=1;

 

REF(OC)

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

00002802092566176EC8E2167DE053C901A8C072542566176EC8E1167DE053C901A8C07254028001FD0000

这一长串数字和字母就是OID,标识数据库中的对象的位置。

使用REF类型来定义一个对象引用。

CREATE TABLE purchases (

  id           INTEGER PRIMARY KEY,

  customer_refREF t_person  SCOPE IS object_customers,

  product_ref  REF t_product SCOPE IS object_products

);

其中customer_ref列被限制在指向object_customers表中的对象。

INSERT INTO purchases (

  id,

  customer_ref,

  product_ref

) VALUES (

  1,

  (SELECTREF(oc) FROM object_customers oc WHERE oc.id = 1),

  (SELECT REF(op)FROM object_products  op WHERE op.id = 1)

);

查询如下:

object_user@PDB1> select * from purchases;

 

         ID

----------

CUSTOMER_REF

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

PRODUCT_REF

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

          1

00002202082566176EC8E2167DE053C901A8C072542566176EC8E1167DE053C901A8C07254

00002202082566176EC8F0167DE053C901A8C072542566176EC8EF167DE053C901A8C07254

         可以使用DEREF()函数检索存储在对象引用中的实际对象。

执行如下:

object_user@PDB1> selectderef(customer_ref),deref(product_ref) from purchases;

DEREF(CUSTOMER_REF)(ID, FIRST_NAME,LAST_NAME, DOB, PHONE, ADDRESS(STREET, CITY, STATE, ZIP))

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

DEREF(PRODUCT_REF)(ID, NAME, DESCRIPTION,PRICE, DAYS_VALID)

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

T_PERSON(1, 'John', 'Brown', '01-FEB-55','800-555-1211', T_ADDRESS('2 State Street', 'Beantown', 'M

A', '12345'))

T_PRODUCT(1, 'pasta', '20 oz bag of pasta',3.95, 10)

4.  比较对象值

可以在查询的WHERE子句中使用等于操作符来比较两个对象的值。

执行如下:

object_user@PDB1> select oc.id,oc.first_name,oc.last_name,oc.dobfrom object_customers oc where value(oc)=

   t_person(1,'John','Brown','01-FEB-1955','800-555-1211',

   t_address('2 State Street','Beantown','MA','12345'));

 

         IDFIRST_NAME LAST_NAME  DOB

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

          1 John      Brown    01-FEB-55