Oracle触发器使用介绍
触发器,函数,包都是可以再生利用的东西,所以在创建的时候都要用到create or replace这个万能语句,接着就是主角trigger的出现了,主角出现还需要一点点波动,通常大人物都不是随随便便就显现的,所以要配上before [after] insert[update/delete] on tableName.
create or replace trigger is tri_update[/insert/delete/UID]_tableName before[after] insert[update/delete/or 。。。] on tableName [for each row]--这个一般都要加上,因为我们一般都是行级触发器,即对每一行都操作 [declare locateParamater1 type; locateParamater1 type;] --又见begin...end; begin --do something; end;
(1)关于new和old,在使用之前联系实际想一想吧,insert的时候肯定没有old啊,delete的时候肯定没有new啊,只有update的时候old和new同时拥有,还要指出的是new和old都是rowtype的,即可以代表相应的一行。对于new和old的实际用法,请看实例。
(2)对于when的时候,要注意里面的old和new,没有冒号。还有在写raise_application_error的时候要注意他的参赛格式(number,‘Some thing you want to say’),其中的number是从-20000到-20999
/*完成:
、当向SC表插入数据时,修改(或添加)SC_NUMBER(包括学生学号和选课门数两列)表格中的数据。*/ create or replace
trigger tr_Insert_Sc after insert on sc
for each row
begin
--insert 的时候使用:new
update SC_Number set ccount=ccount+1 where SC_Number.Sno=:new.Sno;
end;
/*
、当删除SC表中数据时,修改(或添加)SC_NUMBER中的数据。*/
insert into sc values('','C01','');
delete from sc where sno='' and cno='C01'
select * from sc where sno=''
select * from SC_Number;
create or replace
trigger tr_Delete_Sc after delete on sc
for each row
begin
update SC_Number set ccount=ccount-1 where SC_Number.Sno=:old.Sno;
end;
/*
、当修改SC表中数据时,若修改的是学号,则对应修改SC_NUMBER表中的选课门数,
否则打印“某某(学生姓名)的学生选课信息已经修改”信息。*/
insert into sc values('','C01','');
delete from sc where sno='' and cno='C01'
select * from sc where sno=''
select * from sc where sno=''
select * from SC_Number;
update sc set sno='' where sno=''
update sc set grade=90 where sno='' and cno='C06'
create or replace
trigger tr_Edit_SC after update on SC
for each row
declare
student_name student.sname%type;
begin
if :new.sno=:old.sno then
select sname into student_name from student where student.sno=:new.sno;
dbms_output.put_line(student_name||'Have changed');
end if;
if :new.sno<>:old.sno then
update SC_Number set ccount=ccount-1 where SC_Number.Sno=:old.Sno;
update SC_Number set ccount=ccount+1 where SC_Number.Sno=:new.Sno;
end if;
end; /* 1、修改STUDENT表数据时,限制不能修改学生的系别(不能修改CS系学生的系别)。*/
select * from student;
update student set student.sname='XXX' where student.sno='';
create or replace
trigger tr_Edit_Student_cons before update on student
for each row
when(old.sdept='CS')
begin
raise_application_error(-20044,'You Cannot edit the information of cs department');
end;
/*2、插入课程时,课程号以‘S’开头的课程的学分不能低于3分。*/
insert into course values('S01','Oracle',3,4)
delete from course where course.cno='S01';
select * from course;
create or replace
trigger tr_Edit_Course_cons before insert on course
for each row
when(new.credit<=5 and new.cno like 'S%')
begin
raise_application_error(-20023,'You can not insert the course name ');
end; /*
、不能删除90分以上学生的选课信息。*/
update sc set grade=98 where sno='' and cno='C10'
delete from sc where sno='' and cno='C10'
select * from sc;
create or replace
trigger tr_delete_SC before delete on SC
for each row
when(old.grade>90)
begin
raise_application_error(-20017,'My grade beyond 90,You cannot delete me');
end; /*
插入Student表中数据时,CS系学生的年龄不能大于30岁。*/
select * from student;
insert into student values('','Shawn',21,'m','CS');
delete from student where student.sno='';
create or replace
trigger tr_insert_Student before insert on student
for each row
when(new.sdept='CS' and new.sage>30)
begin
raise_application_error(-20078,'I am a Cs student.My age should little than 30');
end; /* 当修改Student表中的年龄字段时,使其只能增加,不能减少。*/
select * from student;
update student set sage=38 where sno=''
create or replace
trigger tr_update_Student before update on student
for each row
when(new.sage<old.sage)
begin
raise_application_error(-20089,'Only can beyond the old age!');
end;
/* 删除Student表中的学生信息时,判断在SC表中该学生的平均成绩是否高于60,若高于60,
则不能删除,否则允许删除,同时删除SC表该学生对应的选课信息。*/
select round(avg(grade),2),sno from sc group by sno
delete from student where student.sno=''
select * from sc select * from student where student.sno=''
create or replace
trigger tr_delete_student_cons before delete on student
for each row
declare
avg_score number(4,2);
begin
select round(avg(grade),2) into avg_score from sc where sc.sno=:old.sno;
if avg_score>70.00 then
raise_application_error(-20058,'My average score beyond 60!!!!');
else
delete from sc where sc.sno=:old.sno;
end if; end;
Oracle触发器使用介绍的更多相关文章
- oracle触发器加条件判断
oracle触发器加条件判断,如果某个字段,isnode=0,那么不执行下面的方法,数据如下: create or replace trigger tr_basestation_insert_emp ...
- Oracle 触发器在日志管理开发中的应用
摘要: 本文讨论了利用数据库中的触发器对日志管理进行设计与实现的方法, 是对原来在客户端软件中编写日志管理方法的一种改进, 并给出了 Oracle9i 中的实例演示.关键词: Oracle; 触发器; ...
- oracle触发器应用
首先给大家推荐两篇我看后的博文,我已经内容转载过来: 1.对触发器的讲解 本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建 ...
- Oracle触发器用法实例详解
转自:https://www.jb51.net/article/80804.htm. 本文实例讲述了Oracle触发器用法.分享给大家供大家参考,具体如下: 一.触发器简介 触发器的定义就是说某个条件 ...
- 问题:Oracle出发器;结果:1、Oracle触发器详解,2、Oracle触发器示例
ORACLE触发器详解 本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8.2.2 创 ...
- [转载]Oracle触发器用法实例详解
本文实例讲述了Oracle触发器用法.分享给大家供大家参考,具体如下: 一.触发器简介 触发器的定义就是说某个条件成立的时候,触发器里面所定义的语句就会被自动的执行. 因此触发器不需要人为的去调用,也 ...
- 2014/11/06 Oracle触发器初步 2014-11-06 09:03 49人阅读 评论(0) 收藏
触发器我就不多解释了,保证数据的完整性的神器,嗯..也是减少程序员工作托管给数据库操作的好帮手.就不讲一些大道理了.通俗点,我们对数据库的操作,无非就是增 删 改 查. 触发器就是在删,改,增的时候( ...
- [转]连续创建多个Oracle触发器失败,单个创建才成功的解决方法
连续创建多个Oracle触发器失败,单个创建才成功的解决方法 1.当我连续执行创建多个触发器时,总是报编译通过,但存在警告或错误.如下: create or replace trigger t ...
- Oracle优化器介绍
Oracle优化器介绍 本文讲述了Oracle优化器的概念.工作原理和使用方法,兼顾了Oracle8i.9i以及最新的10g三个版本.理解本文将有助于您更好的更有效的进行SQL优化工作. RBO优化器 ...
随机推荐
- AWR快照管理
创建快照: SQL> exec dbms_workload_repository.create_snapshot(); 删除快照: SQL> exec dbms_workload_repo ...
- java中DriverManager跟DataSource获取getConnection有什么不同?
1.datasource是与连接池获取连接,而DriverManager是获取与数据库的连接! DriverManager类的主要作用是管理注册到DriverManager中的JDBC驱动程序,并根据 ...
- ajax提交含有html数据时的处理方法
这两天在做一个文章内修改的功能,由于前端选用的Extjs控件库,于是就使用Ext.form.HtmlEditor. 在使用ajax提交数据的时候,需要提交包含有html代码的数据.这时候问题就来了,不 ...
- 通用窗口类 Inventory Pro 2.1.2 Demo1(中)
本篇想总结的是Inventory Pro中通用窗口的具体实现,但还是要强调下该插件的重点还是装备系统而不是通用窗口系统,所以这里提到的通用窗口类其实是通用装备窗口类(其实该插件中也有非装备窗口比如No ...
- PostgreSQL Replication之第九章 与pgpool一起工作(6)
9.6 运行pgpool和流复制 pgpool也可以和除了语句级别的复制之外的流复制一起使用.一个完美的方案是使用PostgreSQL的板载复制和仅仅使用pgpool的负载均衡与连接池. 实际上,这样 ...
- C#: PerformanceCounter的使用
在实际编程中,有的时候需要密切注意CPU, Memory的变化.这个时候需要用到PerformanceCounter这个类,注意需要using System.Diagnostics; 这里只是在con ...
- demo06
city_data.xml <?xml version="1.0" encoding="utf-8"?> <resources> < ...
- Windows 服务入门指南
有很多时候,我们需要创建Windows Service. 这篇文章可以算是一个入门指南吧,希望对初学者有帮助. 要创建Windows Service, 首先选择Windows服务项目,如下图: 这里我 ...
- Android 利用Service实现下载网络图片至sdk卡
package com.example.myapp5; import android.app.Activity; import android.content.Intent; import andro ...
- 关于DISTINCE的用法
SQL SELECT DISTINCT 语句 在表中,可能会包含重复值.这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值. 关键词 DISTINCT 用于返回唯一不同的值. 语法 ...