可更新视图的说明

Oracle是一个适用于大中型企业、功能强大且较为复杂的对象-关系型数据库管理系统,它在银行、电信、航空、保险、证券等领域都有着非常广泛的应用。在Oracle数据库的应用当中,经常需要涉及到对视图的操作。Oracle对视图的查询操作没有任何的限制,但是对视图的更新操作往往受到一定的约束。下面介绍如何实现对Oracle可更新视图的设计。
  
  1 视图的概念
  视图(View)是从一个或多个基表(或视图)中导出的表,是一个查询定义,也可认为是一个存储的查询(Stored Query)或是一个虚表(Virtual Table)。视图不同于表,一个视图不分配任何存储空间,不真正地包含数据,视图只在数据字典中存储其定义。视图是数据库开发中应用非常广泛的一种数据库对象。由于它具有限制数据访问、简化查询、提供独立数据、允许多个视图使用相同数据、删除视图时不影响基表等特点,使得我们在开发数据库应用时,降低了数据操作的复杂性、减少了数据层和应用层之间的耦合,最终提高了开发效率。
  可更新视图是指可以进行插入、修改和删除数据操作的视图。Oracle对视图的更新操作有一定的限制,在Oracle数据库中,基于单个基表的视图是可更新的,但对于多表联合的视图,由于它的复杂性,往往受到一定的限制。本文以一个简单的例子说明了视图的基本设计方法,并分析了在Oracle数据库中如何实现对视图的更新。
  建立两个表students和teachers结构。
  其中students表1中的t_id为任课教师编号,与teachers中t_id相关联,在做多表连接时可以认为teachers表为主表(即连接表),students表为从表(被连接表)。下面以 students 表和teachers表为例,设计实现了单表视图 s_view1和多表视图s_view2。
  
  2 单表视图的设计
  若一个视图是从单个基表导出的,并且只是去掉了基表的某些行和列,且保留了基表的主码,这样的视图被称为行列子集视图,又称为单表视图。创建单表视图的方法如下:
  create view s_view1 as select s_id, s_name, s_sex from students;
  创建的视图 s_view1 只涉及到一张表students,并且只是这张表的一部分,将一些不必要的数据隐藏起来,使得部分数据对用户是透明的,增强了系统的安全性。这种方法创建出来的视图是可更新视图,如果在创建视图时加上with read only子句,将其创建为只读视图,则视图即为不可更新。
  
  3 多表视图的设计
  3.1 主键连接方式
  若一个视图是从多个基表中导出,满足一定的连接条件,这样的视图就是多表联合视图。Oracle数据库中多表视图的更新操作受到了一定的限制,普通的无主键连接将不能进行视图的更新操作,只有主表为键值保存表,并且连接条件中包含主表的主键列时,才能够实现视图非主表列的更新创建方法为:
  alter table teachers add primary key(t_id);
  create view s_view2 as select s.s_id,s.s_name,t.t_name,t.t_course from students s,teachers t where s.t_id=t.t_id;
  如果主表无主键列、主键列没有当作连接条件或是更新主表列时都将提示错误。
  用上述方法创建的多表视图,并不是所有的列都可更新,只有非主表的列(即 s_id,s_name)才可以进行更新操作,如果想知道视图中具体哪一列可以更新,可以通过查看SYS方案中DBA_UPDATABLE_COLUMNS视图得到相关信息。
  从上面可以看出,这种创建可更新视图的方法还是有一定局限性的,不能对主表列进行更新操作。本文采用Oracle数据库提供的 instead of 触发器能够很好的解决这一问题。
  3.2 触发器方式
  触发器(Database Trigger)是存储在数据库中的过程,当表或视图被修改时它隐式地被执行。在Oracle中允许在对表或视图发出Insert、Update或Delete语句时隐式地执行所定义的过程,这些过程称为数据库触发器。
  创建触发器的语法如下:
  CREATE [OR REPLACE] TRIGGER trigger_name [BEFORE|AFTER|INSTEAD OF] event
  ON table_or_view_name [FOR EACH ROW[WHEN condition]]
  Oracle数据库中提供了一种INSTEAD OF触发器,对于包含多个基表的视图,可以通过使用INSTEAD OF触发器来支持基表中数据的插入、更新和删除操作。INSTEAD OF触发器的实质就是阻止Oracle去尝试解释更新操作的视图定义,而是使Oracle执行该触发器的主体,依靠触发器的定义来得出有意义的语义。INSTEAD OF触发器总是为视图而创建的,它始终是FOR EACH ROW触发器,这意味着针对每个可以对视图进行删除、更新或插入操作的行,都要执行一次这个触发器。使用INSEAD OF触发器的主要优点就是可以使不能更新的视图支持更新,从而扩大了视图的应用范围,对视图的操作更加直接、方便。该触发器中转换表和转换变量的概念与普通触发器中的概念一致。
  下面以s_view2为例采用INSTEAD OF方式创建update触发器如下:
  create or replace trigger s_tri instead of update on s_view2 for each row
  begin
  update teachers set t_name=:new.t_name,t_course=:new.t_course
  where t_name=:old.t_name;
  update students set s_id=:new.s_id,s_name=:new.s_name
  where s_id=:old.s_id;
  end;
  用上述方法创建的触发器直接作用在视图s_view2上,当对视图进行update操作时,将自动转去执行触发器s_tri,该触发器能够根据不同的sql语句对视图的所有列s_id,s_name,t_name和t_course都可以进行 update操作,弥补了普通主键连接方式只能修改从表的缺陷。Insert触发器和delete触发器的设计方法与上述update触发器的设计方法相似
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
作者gltwy,代码LTScrollView-master,LTScrollView-master能够无限滚动,可以设定视图出现的数量,总数量,实现无限滚动。通过协议方法和数据源定制自己的滚动视图。 Demo文件路径以及说明 LTScrollView / Example : 为 Swift 使用示例. LTScrollView / OCExample : 为 OC 使用示例. 支持的子View为UIScrollView、UICollectionView、UITableView. CocoaPods安装 安装CocoaPods 使用以下命令: $ gem install cocoapods Podfile 在你的 Podfile中添加LTScrollView source 'https://github.com/CocoaPods/Specs.git' platform :ios, '8.0' target 'TargetName' do #注意此处需要添加use_frameworks! use_frameworks! pod 'LTScrollView', '~> 0.1.7' end 然后,使用以下命令安装 $ pod install 提示错误 [!] Unable to find a specification for LTScrollView 解决办法: $ pod repo remove master $ pod setup Swift使用说明 Swift.LTSimple使用说明 创建LTSimpleManager实例对象 @objc public init(frame: CGRect, viewControllers: [UIViewController], titles: [String], currentViewController:UIViewController, layout: LTLayout) 设置headerView @objc public func configHeaderView(_ handle: (() -> UIView?)?) 子控制器中glt_scrollView进行赋值 self.glt_scrollView = self.tableView(self.scrollView / self.collectionView) 更多使用说明请参考Demo(LTScrollView / Example) Swift.LTAdvanced使用说明 创建LTAdvancedManager实例对象、并设置headerView @objc public init(frame: CGRect, viewControllers: [UIViewController], titles: [String], currentViewController:UIViewController, layout: LTLayout, headerViewHandle handle: () -> UIView) 子控制器中glt_scrollView进行赋值 self.glt_scrollView = self.tableView(self.scrollView / self.collectionView) 更多使用说明请参考Demo(LTScrollView / Example) OC使用说明 OC.LTSimple使用说明 创建LTSimpleManager实例对象 [[LTSimpleManager alloc] initWithFrame:frame viewControllers:self.viewControllers titles:self.titles currentViewController:self layout:self.layout] 设置headerView [self.managerView configHeaderView:^UIView * _Nullable{ }] 子控制器中glt_scrollView进行赋值 self.glt_scrollView = self.tableView(self.scrollView / self.collectionView) 更多使用说明请参考Demo(LTScrollView / OCExample) OC.LTAdvanced使用说明 创建LTAdvancedManager实例对象、并设置headerView [[LTAdvancedManager alloc] initWithFrame:frame viewControllers:self.viewControllers titles:self.titles

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值