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子句把一下关而已;
可是我们为什么要使用它呢?有什么好处?

你可能感兴趣的:(Oracle中的面向对象)