zoukankan      html  css  js  c++  java
  • Oracle 多表视图更新(待看完触发器后再来看)

    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可能无法实现更新功能。



  • 相关阅读:
    HDU 4472 Count DP题
    HDU 1878 欧拉回路 图论
    CSUST 1503 ZZ买衣服
    HDU 2085 核反应堆
    HDU 1029 Ignatius and the Princess IV
    UVa 11462 Age Sort
    UVa 11384
    UVa 11210
    LA 3401
    解决学一会儿累了的问题
  • 原文地址:https://www.cnblogs.com/JSD1207ZX/p/9386324.html
Copyright © 2011-2022 走看看