数据库对象同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;
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;