`
yuexiaodong
  • 浏览: 68576 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

oracle触发器更新当前表

阅读更多

装载注明:http://yuexiaodong.iteye.com/blog/1891589

 

       总是有这样的需求,当更新某个表的某条记录,然后需要对该表的某个字段进行更新,通过使用触发器即可完成这项工作。具体思路就是:首先建立一个临时表,然后在行触发器中记录当前操作的记录,然后在语句触发器中更新当前表。这样做的原因是,oracle对行触发器进行了限制,不能对当前表操作(具体如下:删除的行触发器不允许任何DDL操作,插入的行触发器允许通过游标读取数,这些都是我个人认为,欢迎指正!),但语句级触发器又不能获取当前增加或删除的记录,所以使用两类触发器。网上说可以使用自治事务,个人实验一把,没有达到我的目的,后来想想自治事务跟主事务独立,数据应该不是实时的,暂时放弃使用。

需求简介:对A表添加一个记录,根据表中某个字段的count(*)更新该新记录的某个字段属性值;删除某条记录,更新某个属性值;

源码如下:

 ---建立临时表 
CREATE GLOBAL  TEMPORARY TABLE  ttt_Insprofworkty_insert
(
   id NUMBER(10,0),
   workid NUMBER(10,0),
   worktypeid NUMBER(10,0),
   projectid NUMBER(10,0),
   ordervalue NUMBER(10,0)
);

CREATE GLOBAL  TEMPORARY TABLE  ttt_Delprofworktype_delete
(
   id NUMBER(10,0),
   workid NUMBER(10,0),
   worktypeid NUMBER(10,0),
   projectid NUMBER(10,0),
   ordervalue NUMBER(10,0)
);

 

create or replace trigger profworktype_delete
before  delete
on  profworktype
FOR EACH ROW
    -- 完成与删除的相同workid且大于当前删除ordervalue的操作
DECLARE    
	  begin  
	insert into ttt_Delprofworktype_delete values (:old.id,:old.workid,:old.worktypeid,:old.projectid,:old.ordervalue);     			 
          end;
------------------------------------
create or replace trigger profworktype_insert
before  insert
on  profworktype
FOR EACH ROW
   
DECLARE
BEGIN
	  select S_profworktype.NEXTVAL INTO :new.id from dual;
	 insert into ttt_insprofworkty_insert values(:new.id,:new.workid,:new.worktypeid,:new.projectid,:new.ordervalue);     
      
END;

 

---------------------------------
语句触发器完成业务
 create or replace trigger profworktype_statement
after   delete   or insert
on  profworktype
    -- 完成与删除的相同workid且大于当前删除ordervalue的操作
DECLARE
       v_count  NUMBER(10,0);
        cursor  cur_del  is select * from  ttt_Delprofworktype_delete deleted;
				cursor  cur_ins  is select * from ttt_Insprofworkty_insert    inserted;
    begin
			 if deleting then
				           begin
                    for i in cur_del loop
                     begin
                      -- dbms_output.put_line('-------'||i.ordervalue);
                       update  profworktype set ordervalue = ordervalue -1 where workid = i.workid and ordervalue > i.ordervalue ;
                       end ;
                       end loop;
                        delete from Ttt_Delprofworktype_Delete;
			 end ;    
			 end if;
			 -----
			 if inserting then
				  begin
				  for i in cur_ins loop
                            begin        
				v_count := 0;
         select   count(*) INTO v_count from  profworktype where ordervalue is not null and workid = i.workid;   		  
       update  profworktype set ordervalue = v_count+1 where id =i.id; 		 
            end ;
      end loop;
       delete from ttt_Insprofworkty_insert;
			end ;   
			end if;
			end;

 

 

分享到:
评论

相关推荐

    Oracle触发器修改自身表

    1、行级触发器不支持 ...所以想要触发器对自身表数据做修该,则用行级触发器得到 :new 和 :old对象中的相关数据,然后将这样的数据保存到 package中,然后在语句级触发期中调用 package包中保存的数据,进行更新操作

    oracle 查看当前会话执行的sql语句

    查询ORACLE 系统中当前会话正在执行的有关SQL语句。

    实验六-触发器实验报告.doc

    理解Oracle触发器的种类和用途 2. 掌握行级触发器的编写 [预备知识] 1. PL/SQL程序设计 [实验原理] 1. 建立触发器 CREATE [OR REPLACE] TRIGGER <触发器名> BEFORE"AFTER INSERT"DELETE"UPDATE OF <列名> ON <表名>...

    Oracle 当前用户下所有表的记录总数

    您可能感兴趣的文章:shell脚本操作oracle删除表空间、创建表空间、删除用户杀掉oracle在线用户脚本分享[Oracle] 如何使用触发器实现IP限制用户登录在命令行下进行Oracle用户解锁的语句深入探讨:Oracle中如

    Oraclet中的触发器

    2 替代触发器:由于在ORACLE里,不能直接对由两个以上的表建立的视图进行操作。所以给出了替代触发器。它就是ORACLE 8专门为进行视图操作的一种处理方法。 3系统触发器:ORACLE 8i 提供了第三种类型的触发器叫...

    Oracle学习记录之使用自定义函数和触发器实现主键动态生成

    很早就想自己写写Oracle的函数和触发器,最近一个来自课本的小案例给了我这个机会。现在把我做的东西记录下来,作为一个备忘或者入门的朋友们的参考。  案例介绍:  招投标管理系统(数据库设计)。  数据表有...

    oracle和mysql的区别

    在ORACLE(db2也一样)中表空间是文件系统中的物理容器的逻辑表示,视图、触发器和存储过程也可以保存在表空间中。而MYSQL并没有使用表空间来进行管理。 2.查询当前所有的表。ORACLE: select * from tab,MYSQL:...

    删除oracle下当前用户创建的所有对象

    在PLSQL中用户登陆后,使用以上脚本一次性删除所有该用户创建的对象,包括表,视图,序列,触发器,存储过程等等,恢复到数据库刚刚创建的那个状态。

    oracle培训教程ppt

    总之,内容基本上包括当前Oracle8I的最新内容。同时也覆盖了最新的ORACLE8i OCP培训大纲的内容。不仅包含ORACLE 程序设计人员、DBA所必须掌握的知识,而且还含盖了系统分析员所要求的内容。与本书(讲稿)相伴的还有...

    常见oracle问题的总结

    常见的oracle问题汇总,...11. 怎样得到触发器、过程、函数的创建脚本? 12. 怎样计算一个表占用的空间的大小? 13. 如何查看最大会话数? 15. 如何以archivelog的方式运行oracle。 76. 如何显示当前连接用户? ......

    Oracle8i/9i数据库基础

    总之,内容基本上包括当前Oracle8I的最新内容。同时也覆盖了最新的ORACLE8i OCP培训大纲的内容。不仅包含ORACLE 程序设计人员、DBA所必须掌握的知识,而且还含盖了系统分析员所要求的内容。与本书(讲稿)相伴的还有...

    Oracle8i_9i数据库基础

    总之,内容基本上包括当前Oracle8I的最新内容。同时也覆盖了最新的ORACLE8i OCP培训大纲的内容。不仅包含ORACLE 程序设计人员、DBA所必须掌握的知识,而且还含盖了系统分析员所要求的内容。与本书(讲稿)相伴的还有...

    Oracle8i_9i数据库基础.txt

    总之,内容基本上包括当前Oracle8I的最新内容。同时也覆盖了最新的ORACLE8i OCP培训大纲的内容。不仅包含ORACLE 程序设计人员、DBA所必须掌握的知识,而且还含盖了系统分析员所要求的内容。与本书(讲稿)相伴的还有...

    一个oracle客户端(oracle sql handler)

    提供对常用数据字典(如 表、视图、索引、同义词、约束、过程、触发器等)的常用操作。例如,输入 “%NAME” 或 “NAME%” 或 “%NAME%”,能查找包含子串 “NAME” 的所有对象名,通过弹出菜单可以对每一个对象...

    非常全的oracle文档

    1. 查看当前的Oracle实例名称和主机名称: 27 2. 查看用户帐户及状态 27 十、 Oracle用户解锁 27 1. 对scott用户解锁 27 2. 更改scott用户的密码: 27 3. 锁定scott用户: 27 十一、 使用OEM 27 十二、 SQL/PLUS连接...

    韩顺平oracle学习笔记

    如:触发器,此软件oracle不带,需要单独安装。,5)oracle的企业管理器(oem,oracle,enterprise,manager),位置在,,开始,程序,oracle,oracle,oraclehome90,enterprise,manager,console, ,,即可启动oracle的企业管理...

    ORACLE9i_优化设计与系统调整

    §3.2.4 显示当前参数值 69 §3.2.5 参数的使用 69 §3.2.6 参数的类型 69 §3.2.7 不能在参数文件中指定的参数 70 §3.2.8 当参数指定错误时怎么办? 70 §3.3 参数内容说明 70 §3.4 DBA常用参数说明 71 §3.4.1 ...

    Oracle数据库基础.doc

    总之,内容基本上包括当前Oracle的最新内容。同时也覆盖了最新的ORACLE8i OCP培训大纲的内容。不仅包含ORACLE 程序设计人员、DBA所必须掌握的知识,而且还含盖了系统分析员所要求的内容。与本书(讲稿)相伴的还有...

Global site tag (gtag.js) - Google Analytics