壹佰网|ERP100 - 企业信息化知识门户

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 4967|回复: 8

如何实现基于多表视图的更新操作

[复制链接]
发表于 2007/5/31 20:05:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。如果您注册时有任何问题请联系客服QQ: 83569622  。

您需要 登录 才可以下载或查看,没有帐号?注册

x
作form时用到了两个视图组成的主从块,想利用视图来更新基表的数据,请各位详细指导。
注:我的两个视图均不含集合操作(UNION,UNION ALL,INTERSECT,MINUS) 、没有DISTINCT 、没有聚集函数(AVG,COUNT,MAX,MIN等)和分析函数、 没有GROUP 、BY,ORDER BY,CONNECT BY,START WITH 、SELECT列表中没有出现collection expression 、SELECT列表中没有子查询、不是JOIN查询、SELECT列表中没出现系统的伪列或表达式
发表于 2007/5/31 21:32:46 | 显示全部楼层
FORM的数据块集触发器on-update,on-insert和on-delete可以编写DLL和DML语句的执行代码,如果不编制这几个触发器,FORM会默认执行insert into ,update 和delete,当然,如果视图涉及多表就会报错。
最好的方法就是你自己来判断数据规则,将你想执行的操作语句编制到这几个触发器中,比如,当触发新增记录事件时,你可以在触发器on-insert中写insert into <table-name> values <...>来指定被操作的基表
发表于 2007/5/31 21:35:15 | 显示全部楼层
同时,FORM的键模式要设置成“可更新”,允许使用主键设置为“是”,另外在指定数据块中的某一项为主键
发表于 2007/5/31 21:36:51 | 显示全部楼层
这种方法比较常用,但是相对来说做起来比较繁琐,要写严密的代码。我记得论坛里有人发过一个比较简单的方法可以直接通过配置FORM属性选项来实现,你可以在贴子里面搜索一下
 楼主| 发表于 2007/6/5 14:22:24 | 显示全部楼层
我在这个论坛里搜过了,可没搜到,能给个搜索提示吗?
 楼主| 发表于 2007/6/21 15:21:09 | 显示全部楼层
这个问题是我做的一个form练习里的,并且这个问题已经解决。虽然解决的很蹩脚,还依然存在对form中触发器的使用与触发时间及执行顺序和数据块的操作、状态了解不甚清楚的问题,但目的还是达到了
关于这个练习在做的过程中出所问题的详细内容及解决方法请看http://www.itpub.net/showthread. ... 316&pagenumber=
还请各位多多指导。
发表于 2007/6/21 16:37:52 | 显示全部楼层
你可以把查询数据块的类型设置为不是数据库数据块,把数据源名称也清掉
发表于 2007/7/13 11:07:11 | 显示全部楼层

回复 #2 bhbb2000 的帖子

光是利用on-update,on-insert和on-delete還不夠喔,還要加上 on-lock

以 wlh_hong 的狀況來說,利:用 Form 來使用 兩個 View ,Query 一定是 Ok ,但資料要寫入到 View 對應的 Table 中時,就如 bhbb2000 所言,利用 block level trigger : on-insert、on-update、on-delete、on-lock ,自己寫 script 來取代 block 對 data source 的 insert 、update 、delete、.及 lock 功能

至於利用 form 的屬性設定來達到這個功能的做法,我沒用過,倒是很好奇,但也搜尋不到,不知是否有人能給予指點,多學個幾招總是好的 ^^
发表于 2007/7/13 13:38:26 | 显示全部楼层
转摘 www.oradev.net->法师的技术笔记-多表可更新视图的实现
1 前言
多表视图的定义:当视图的数据源只有一张数据表,则该视图为单表视图;当视图的数据源是多张数据表,则该视图为多表视图。
可更新视图的定义:在绝大多数人的概念中,视图是只读的,不允许修改。ORACLE 8i以上版本,单表视图如果没有设定With Read Only,则该视图是可以更新的,对视图的操作将直接写入的数据表中。
那么,如果视图的数据源是多张数据表,而多表视图如果实现可更新视图,则可以大大提高编码的效率。

2 多表可更新视图的应用范围
在程序实现过程中,我们往往会将诸如产品编号、计量单位、客户信息等等存储于独立的数据表,在销售单据、出入库单据等处,引用其主键ID,就可以指向相关详细信息。
在查询视图上,我们仅需要确定关联关系即可,但在数据录入界面,我们要实现多表信息同步编辑功能时,往往会遇到困扰。需要应用各种各样的编程方法,实现用户需求。
多表可更新视图大大简化前台编程的工作量,对于前台FORM,可以认为该多表可更新视图就是一张完整的业务数据表,而数据的存储逻辑则建立于后台视图的Instead of 触发器中。

3 多表可更新视图的后台实现
建立多表视图的Instead Of Trigger,在Trigger中定义数据存储逻辑,就实现了多表可更新视图<复杂的技术难点,解决的方法往往是无比简单的>。实例如下:
3.1 创建测试数据表
--===================================================
--创建测试表
--===================================================
Drop Table t1;
Drop Table t2;
create table t1
( t11 numeric(28),t12 varchar2(20));
create table t2
( t11 numeric(28),t22 varchar2(20));
3.2 多表视图范例
--===================================================
--创建测试视图
--===================================================
create Or Replace view t as
   select T1.t11 f1 ,T1.t12 f2 ,T2.t22 f3
      from T1,T2  
      Where T1.t11=T2.t11;
3.3 多表视图触发器范例      
--===================================================
--创建视图的替代触发器
--===================================================
Create Or Replace Trigger Trg_InsUpdDel_t
  Instead Of Insert or update or delete
  on t
  for each row
Declare
begin
   If Inserting Then
      Insert Into t1 (t11,t12) Values (:New.f1,:New.f2);
      Insert Into t2 (t11,t22) Values (:New.f1,:New.f3);
   elsif Updating Then
      Update t1 set t11=:New.f1,t12=:New.f2 where t11=:New.f1;
      Update t2 set t11=:New.f1,t22=:New.f3 where t11=:New.f1;
   elsif Deleting then
      Delete from t1 where t11=:Old.f1;
      Delete from t2 where t11=:Old.f1;
   End if;
end;
如此即实现多表可更新视图的定义工作,大家可以试着使用Insert或Delete或Update的SQL语句测试一下。
3.4 数据库后台注意事项
当视图使用Create Or Replace View...重新编译后,该触发器就会被覆盖,找不到了。所以大家记得在重新编译多表可更新视图之后,要重新创建其触发器。

4 多表可更新视图的前台实现及注意事项
4.1 基本实现
在数据源中,定义数据块的数据源为多表可更新视图,即可实现前台设定。
当然还有许多注意事项,否则大家在实际应用过程中就会觉得困难重重。
4.2 FORM前台注意事项
4.2.1 主键,如果多表可更新视图中,包括外联<如:Where t1.t11=t2.t11(+)>,则必须在FORM中定义主键,包括数据块的主键和数据项的主键属性。否则,FORM将会提示“视图不允许更新”。
4.2.2 SQL,多表视图如果使用Union或Distinct,则前台FORM可能无法实现更新功能。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|手机版|壹佰网 ERP100 ( 京ICP备19053597号-2 )

Copyright © 2005-2012 北京海之大网络技术有限责任公司 服务器托管由互联互通
手机:13911575376
网站技术点击发送消息给对方83569622   广告&合作 点击发送消息给对方27675401   点击发送消息给对方634043306   咨询及人才点击发送消息给对方138011526

GMT+8, 2025/11/30 00:30 , Processed in 0.016172 second(s), 14 queries , File On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表