125.Oracle数据库SQL开发之 数据库对象——数据库中使用对象类型
欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/50087049
如何在数据库表中使用这些类型。可以使用对象类型定义表中单个的列,随后存储在此列中的对象称为列对象(column object)。也可以使用对象类型定义表中的一整行,然后此表称为对象表。可以使用对象引用(object reference)来访问对象表中单独的行。
创建一个名为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
可以使用对象类型来定义整个表,这样一个表称为对象表。
创建一个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)
对象表中的每个对象都具有唯一的对象标记符(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)
可以在查询的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