oracle 对象定义被修改,oracle的数据库对象类型的使用——创建、增、删、改以及查询...

数据库对象同JAVA中的对象是一样的.有属性和方法.

oracle创建对象类型

create or replace TYPE address_typ AS OBJECT

(

street varchar2(15),

city varchar2(15),

state char(2),

zip varchar2(5)

);

create or replace type person_typ as object

(

id number,

nanm varchar2(10),

dob date,

phone varchar2(12),

address address_typ--引用上面的对象类型.(对象类型可以相互引用)

);

现在写一个带有函数的对象类型.这个对象用于表示产品.注意声明了一个函数

get_sell_by_date().这个函数根据days_valid属性和当前日期,返回产品的最晚售出时间.

create or replace product_typ as object

(

id number,

name varchar2(15),

description varchar2(22),

price number(5,2),

days_valid number,

MEMBER Function get_sell_by_date Return Date

);

Member function子句用于声明get_sell_by_dat函数,

Member procedure子句用于声明一个过程.

---由于在对象类型product_typ 中声明了方法(函数),所以必须为product_typ创建对象体(body).下面是创建product_typ的对象体.

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 get_sell_by_date;

end product_typ;

可以看出,函数通过将days_valid属性与当前日期相加,计算并返回产品当前最晚必须售出时间.

---可以通过describe来获取有关对象类型的信息

describe product_typ;

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

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

对象类型可以用来定义表中的列,这种列称为列对象(Column object).同时,当对象类型包含嵌入对象类型时,嵌入对象类型也是一个列对象.person_typ(见上面)就是这样一个例子.

创建products表:--这种表是包含列对象的表

create table products

(

product product_typ,

quantity_in_stock number--库存数量

);

对象表:使用对象类型来定义整个表.这种表叫对象表.

下面这个例子创建两个对象表object_products和object_customers,分别使用product_typ和person_typ定义.注意OF子句用于将每个表标识为对象表:

例子:

create table object_products of product_typ;

create table object_customers of person_typ;

对象表与包含列对象的表这两者的区别是:

后者可以具有多列.

-------对象引用和对象标识符

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

create table purchases

(

id number primary key,

customer REF person_typ SCOPE IS object_cusotmers,

product REF product_typ SCOPE IS object_products

);

SCOPE IS子句将对象引用限制在特定表中的对象上.例如列customer被限制在指向ojbect_customers表中的对象.

==========================================================================

下面对products,object_products,object_customers,purchases表进行DML操作.

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

-----对products(包含列对象的表)进行DML操作

1.插入

insert into products(product,quantity_in_stock)

values(product_typ(1,'pasta','20 oz bag of pasta',3.95,10),50);

2.查询

--全查询

select * from products;product列对象的属性显示在product_typ的构造函数中.

--查询单个列对象:注意product对象的id属性的表被赋予别名p

select p.product from products p where p.product.id=1;

--查询列对象中声明的方法(函数和过程)

在prodcut_typ对象类型中包含get_selll_by_date()函数,用于计算并返回某件产品的最晚售出时间.

select p.product.get_sell_by_date() from products p;

3.修改

注意访问product列对象时使用了表别名

update products p set p.product.description='30 oz bag of pasta'

where p.product.id=1;

4.删除

delete from products p

where p.product.id=2;

-------对object_products(对象表)表进行DML操作

1.插入(两种形式同sql一样)

insert into object_products

values(product_typ(1,'pasta','20 oz bag of past',3.86,10));

insert into object_products (id,name,description,price,days_valid)

values(2,'sardines','12 oz box of sardines',2.99,5);

2.选择记录

select * from object_products;

可以用Oracle数据库内置的value()函数从对象表中查询记录.这种方法将记录看作真正的对象,并在对象类型的构造函数中返回对象的属性.value()函数接受表别名作参数.

select value(op) from object_products op;

3.更新

update object_products set description='25 oz bag of pasta' where id=1;

4.删除记录

delete from object_products where id=2;

---------对object_customers(对象表)进行DML操作

1.插入

insert into object_customers values

(

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

address_typ('2 stat street','Beantown','MA','123456'))

);

2.查询

object_customers表是person_typ的对象表;person_typ包含嵌入的address_typ列对象address.

---全查询

select * from object_customers;

---查询一条记录

select * from object_customers oc where oc.id=1;--id是person_typ中的id

---对嵌入的列对象的state属性的查询

select * from object_customers oc

where oc.address.state='MA';

3.更新和删除同对object_products的操作一样(略)

--------对purchases(这种表是包含列对象的表,但是较特殊的一种.这包含的列对象是对象表(通过REF),而不是对象类型)表进行DML操作

1.插入

对象表中的每一条记录都具有惟一的对象标识符,这个标识符可保存在REF列中.可通过REF()函数访问这个对象标识符,并将返回的对象标识符保存在REF列中.

insert into purchases (id,costome,product)

values(1,(select REF(oc) from object_customers oc where oc.id=1),

(select REF(op) from object_products op where op.id=1));

这个例子记录的是顾客#1购买了产品.

2.查询(选择记录)

--全查询

注意customer和product列中包含很长的数字字母串,这些是指向object_customers和object_products表中记录的对象标识符.

select * from purchases;

--访问customer和product列所指向的记录

可以使用DEREF()函数通过REF列的值访问它所指向的对象表中的记录;这个函数接受REF列作为参数.

select DEREF(customer),DEFER(product) from purchases;

3.更新

--修改purchases表中的一条记录.注意product列的值被改为指向object_products表中的产品#2

update purchases set product=(select REF(op) from object_products op

where op.id=2) where id=1;

===============================

------------在PL/SQL中使用对象

程序包product_package中

包含一个get_products()函数,返回object_products表中的对象

一个insert_product()过程,向ojbect_products表中增加一个对象.

----product_package

程序包规范

create or replace package product_package as

Type ref_cursor_typ IS REF CORSOR

function get_products return ref_cursor_typ;

procedure insert_product(

p_id in ojbect_products.id%type,

p_name in object_products.name%type,

p_descirption in object_products.description%type,

p_price in object_products.price%type,

p_days_valid in object_products.days_valid%type

);

end product_package;

程序包主体

create or replace package body product_package as

function get_products return ref_cursor_typ

is

products_ref_cursor ref_cursor_typ;

begin

open products_ref_cursor FOR select value(op) from object_products op;

return products_ref_cursor;

end get_products;

procedure insert_product(

p_id in ojbect_products.id%type,

p_name in object_products.name%type,

p_descirption in object_products.description%type,

p_price in object_products.price%type,

p_days_valid in object_products.days_valid%type

)

as

product product_typ:=product_typ(p_id,p_name,p_description,p_price,p_days_valid);

begin

insert into object_products values(product);

commit;

exception

when others then

rollback;

end insert_product;

end product_package;

说明:get_products()函数使用value将object_products表的内容作为product_typ对象返回.

下面是对过程和函数的调用

call product_package.insert_product(4,'sals','15 oz jar of salsa',1.50,20);

select product_package.get_products from dual;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26690043/viewspace-716311/,如需转载,请注明出处,否则将追究法律责任。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值