Oracle中的面向对象
Oracle既是ORDBMS也是RDBMS;
ORDBMS:
允许定义对象类型;
在关系数据库中存储复杂的业务模型;
开发应用程序的速度更快;
说白了,普通的关系数据库管理系统的数据类型都是
定义好了的;而面向对象的数据库管理系统允许用户
自己定义新的数据类型来存储到数据库中;
问题是RDBMS与ORDBMS是有冲突的;
//既然如此,总不能说说而已,我们应该可以通过SQL语句来创建我们的
类型,定义一个类,可以对类进行继承,多态的体验;
Oracle中可用的数据类型
抽象数据类型:
说白了,是父类;
创建过程:
create or replace type address as object
(
province varchar(20),
city varchar(20),
);/
你看看,这和定义一个类多么象,都是从
Object来继承;
接下来可以:
create table student
(stuname varchar(10),
stuAddress address
);
就象我们new出一个class一样;
insert into student values
('tom',address('jiling','changchun','qianjindajie'));
address(..,..,..)是构造函数;
同样也可以用tablename.stuAddress.province定位
查询省份;
update tablename set tablename.stuAddress=address(..,..,..);
如果要创建一个可以被扩展的类型,必须在最后加上
not final关键字;
create or replace type person as object
(
name varchar(10),
sex varchar(2)
) not final;
create or replace student under person
(
stuno int ,
stuscore int
);
这时,这个student 类型包含了他的父类的内容;
如果直接基于一个类型创建一个表,则这个表
叫做对象表:
create table stu of student;
则创建了一个和类型student定义的字段一样
的表,这个表可以进行数据操作而类型
是不可以的;
总之,面向对象是深入人心的;
//由于昨天没有在create or replace type..后加一个/,所以无法执行,
今天重新再看一遍这段视频学习一下:
创建类型:
create or replace type address_type
as object
(
province varchar(30),
city varchar(40),
street varchar(40)
);
/
从数据字典里查询:
desc user_types;//查看数据字典表的结构;
select type_name from user_types;//查看数据字典表里记录的类型的名字;
//数据字典就是表;
查看类型的结构:
desc address_type;//它跟表是如此地相像;
创建表:
create table studentobj
(
stuname varchar(10),
stuaddress address_type
);
desc studentobj;
----
stunamme varchar(10);
stuaddress address_type;
向表中插入数据:
insert into studentobj values
('jade',address_type('gansu','qingyang','xiaoxian34'))
/
查询时的规则:
你可以
select stuname, stuaddress from studentobj;
但是如果你试图查询详细到stuaddress的每个属性上,
则select stuaddress.province ... from studentobj;是行不通的;
必须给表一个别名:
select s.stuaddress.province ... from studentobj s;
更新:
update studentobj set stuaddress=address_type('','','');
如果只修改stuaddress的一个属性而不是全部,可以:
update studentobj s set s.stuaddress.province='beijing'
创建一个可被继承的类型:
create or replace type person
as object
(
name varchar(10),
sex varchar(2),
birth date
) not final;
/
创建继承子类型:
create or replace type student_type
under person
(
id int,
score int
);
/
创建对象表:
create table student of student_type
/
创建的对象表和对象类型的定义完全一样;
对象表和普通的关系表是不一样的;
当然在具体操作上只是create的语句不一样;
而其他的操作都一样;
创建对象表深刻体现了面向对象:用一个模型student_type来
new 出一个student,而不象关系表那样用基本数据类型来
定义一个表;
一句无法解释的命令:
insert into student
select student_type('mike','m',to_date('05-2-2','yy-mm-dd'),1002,78)
from student where name='ppp';
其实也可以解释:
这个语句追求的不是真要从from studnet where name='ppp'中得到一个数据,
而是追求希望from studnet where name='ppp'返回一个true,其实本语句的
的真正目的就是直接插入student_type(...),只不过希望from子句把一下关而已;
可是我们为什么要使用它呢?有什么好处?