`
yuexiaodong
  • 浏览: 70344 次
  • 性别: 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触发器

    ### Oracle触发器详解 在Oracle数据库管理中,触发器是一种非常强大的工具,它允许你在特定的数据库事件(如数据插入、更新或删除)发生时自动执行预定义的SQL语句或PL/SQL代码块。这使得数据库能够在无需外部程序...

    oracle触发器调用存储过程

    ### Oracle触发器调用存储过程 #### 知识点概览 1. **触发器基本概念** 2. **存储过程简介** 3. **触发器如何调用存储过程** 4. **示例代码详解** 5. **注意事项** 6. **自主事务(Autonomous Transaction)** 7. ...

    开发篇之Oracle触发器心得

    Oracle触发器是数据库中的一个重要组成部分,它们允许开发者在特定的数据操作发生时执行自定义的PL/SQL代码。在Oracle数据库中,触发器主要分为三类:INSERT、UPDATE和DELETE,分别对应于数据插入、更新和删除时的...

    oracle触发器实例讲解

    Oracle触发器是数据库对象,用于在特定的数据库操作(如INSERT、UPDATE或DELETE)发生时自动执行一段PL/SQL代码。触发器可以帮助实现业务规则、数据验证和审计功能。以下是一些实例,详细解释了如何创建和使用Oracle...

    oracle中记录用户登录信息的触发器的例子

    - 将当前登录用户的用户名(`user`)、客户端IP地址(`sys_context('userenv','ip_address')`)以及当前日期(`sysdate`)插入到`logon_table`表中。 ```sql SQL> create or replace trigger logon_trigger 2 after ...

    oracle创建触发器实例

    另一个是针对`tbname`表的列`columnname`更新后的触发器,定义了一个游标`cr`来获取特定用户名的密码信息。 总结来说,这个Oracle创建触发器的实例展示了如何使用触发器进行权限控制和日志记录,同时提供了关于如何...

    数据库oracle触发器课件

    Oracle8i引入了新的功能,允许从SQL语句中调用函数,但这种调用有特定限制,比如函数不能读取或修改由当前DML语句操作的表,但可以操作其他表。 总的来说,Oracle的触发器和包是强大的数据库编程工具,它们可以帮助...

    Oracle触发器.pdf

    Oracle触发器是一种特殊类型的存储过程,它在满足特定条件时自动执行。触发器可以与数据库表相关联,在执行DML(数据操纵语言,包括INSERT、UPDATE、DELETE)操作前、后或者代替这些操作时触发。本篇文章详细介绍了...

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

    ### Oracle 查看当前会话执行的SQL语句 在Oracle数据库管理中,有时我们需要了解某个特定会话(Session)正在执行哪些SQL语句。这在性能调优、问题诊断等场景下尤为重要。以下将详细介绍如何通过不同的方法来查看...

    16.Oracle触发器1

    Oracle触发器是数据库对象,它是一种在特定事件发生时自动执行的存储过程。触发器的执行无需用户显式调用,而是由数据库系统在特定事件(如DML操作或DDL操作)触发时隐式运行。触发器由三部分组成:触发条件(即触发...

    Oracle Form 触发器的执行顺序

    Oracle Form 触发器的执行顺序 Oracle Form 是 Oracle E-Business Suite R12 中的一个功能强大且灵活的开发工具,用于创建复杂的商业应用程序。其中,触发器(Trigger)是一种非常重要的组件,它可以根据不同的事件...

    oracle监控某表变动触发器例子(监控增,删,改)

    总结来说,这个Oracle监控表变动触发器例子是通过创建一个触发器来实时捕获对`test_table`的DML操作,并将这些操作的信息存入历史表`test_table_h`。这种方法可以有效地跟踪数据的变动,确保数据完整性,并且有助于...

    利用Oracle触发器实现临床用药目录分级提示.pdf

    【Oracle触发器实现临床用药目录分级提示】 在临床医疗领域,合理用药是保障患者安全、提高医疗服务质量和控制医疗费用的重要环节。随着医疗保险制度的普及,如何避免医保范围外的不合理用药,成为医疗机构面临的...

    oracle触发器(trigger).pdf

    Oracle还提供了`CHECK`约束,用于在插入或更新表中的数据时检查数据的有效性,而触发器可以用来执行更为复杂的数据完整性检查。 在SQL Server环境中,触发器的概念与Oracle类似,但在语法和一些触发器特有的功能上...

    Oracle触发器在税务MIS开发中的应用.pdf

    Oracle触发器在税务MIS开发中扮演着至关重要的角色,主要应用于数据完整性的维护、分布式删除操作、数据冗余管理以及动态数据处理。在税务信息管理系统(MIS)的开发中,通常会遇到数据一致性、批量删除和实时信息...

    ORACLE触发器语法

    在深入探讨ORACLE触发器语法之前,我们先来理解一下触发器的基本概念。触发器是数据库中的一个存储过程,它会在特定的事件(如数据插入、更新或删除)发生时自动执行。ORACLE触发器是一种强大的工具,允许数据库管理...

Global site tag (gtag.js) - Google Analytics