oracle数据库之ref及deref

26 篇文章 0 订阅
7 篇文章 0 订阅

Oracle之面向对象
ORACLE在关系数据库外,融入了面向对象的元素
比如可以创建type,type之间可以继承,
type可以带:

  • 构造函数
  • 排序函数
  • 各种各样的成员函数
  • 存储过程

对象表
是指该表的一行就是一个对象,有一个OID(object ID),
对象表之间没有主外键关联的概念,
为了体现这层关系,oracle中用了 ref 对象来实现。

例1
创建一个地址类型,一个人员类型;
人员有地址属性,所以在人员类型中设置一个ref address来确定指向他所在地址的指针。

1 创建地址类型

create type address as object(
  street varchar2(35),
  city varchar2(15),
  state char(2),
  zip_code integer
);

2 创建地址对象表

 create table obj_address of address; 

3 创建人员类型

create type person as object(
  first_name varchar2(15),
  last_name varchar2(15),
  birthday date,
  home_address ref address,    --指向对应的地址,该地址应该在另外一个对象表中的一行
  phone_number varchar2(15)
);

4 创建人员对象表

CREATE TABLE obj_person of person;

5 插入一个地址

insert into obj_address values(address('nanhai','shenzhen','gd','518054'));
insert into obj_address values(address('shennan','shenzhen','gd','518057'));

6 插入一个人员
注意这里的 home_address 部分是如何插入一个ref address的。

 insert into obj_person 
 values(person('shitou',
               'haha',
               to_date('1982-07-05','yyyy-mm-dd'),
               (select ref(a) from obj_address a where street='nanhai'),
               '1355555555'
               )
       );

7 也可以用下面的过程来插入一个人员记录

declare
  addref ref address;
begin
  select ref(a) into addref from obj_address a where street='nanhai';
  insert into obj_person 
  values (person('shitou',
                 'haha',
                 to_date('1982-07-05','yyyy-mm-dd'),
                 addref,
                 '1355555555'
                )
         );
  commit;
end;

8 查询某人的地址信息

 select first_name,deref(home_address) from obj_person;

9 修改地址

update obj_person
set home_address=(
                  select ref(a) 
                  from obj_address a 
                  where street='shennan'
                  );

10 删除某个人员

delete from obj_person 
where first_name='shitou';

11 删除某个地址的相关人员记录

delete from obj_person 
where home_address=(
                     select ref(a) 
                     from obj_address a
                     where street='nanhai'
                    );
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值