触发器是许多关系型数据库系统都提供的一项技术,在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块,这是他创建的一个格式,这个触发器的作用是什么,触发器以独立的对象存储,就像你在这儿一样能够看到,这是函数了,这里就是触发器

然后呢,与存储过程不同的是,存储过程使用其他程序来启动运行,或者直接启动运行,我们使用declare,begin去调用这个函数,就像JAVA里的方法一样,用这个对象来掉,而这个触发器不一样,触发器是使用一个事件来启动运行的,触发一个事件,事件一启动,一运行,我触发器就运行,触发器是当某个事件发生时自动的隐式的运行,你看不着,但有的时候是看不着的,并且触发器是不能够接收参数的,所以运行触发器的过程叫做,触发或者点火,ORACLE事件指的是对表进行的增删改,类似的一个操作,这个叫触发,触发器需要你关注的点,有这样几个,一个是触发器事件,就是因为什么会导致他的发生,DML里面的增删改,它会导致触发事件的发生,那这个触发的事件是在你触发的事件之前,还是在之后,触发器本身,就是你触发器本身想干什么,就是你触发器本身的操作,触发的频率,频率分成两个,一个叫语句级,一个叫行级,如果你进行一个update的操作,update你想把所有人的数据都加100,都加100,你是需要我在整个都加完以后,触发一次,还是每加一个人就触发一次,这就分成了语句级和行级,行级就是update一次就触发一次,语句级是整个update完了以后,当然也不一定以后,就是你是想前还是后呢,然后触发一次,这就是触发器需要理解的四块

具体怎样来声明,这样的格式,create or replace trigger,触发器名,然后你是要在事件之前或之后执行,触发事件是增删改哪一个,然后是作用哪一个表里的,是一个行级的还是一个语句级的,是这样一个过程,写一个helloworld触发器一个helloworld级别的触发器
create or replace trigger hello_trigger
after
update on employees
--for each row
begin dbms_output.put_line('hello...');--dbms_output.put_line('old.salary:'|| :OLD.salary||',new.salary'||:NEW.salary);
end;
然后执行:update employees set salary = salary + 1000;就是当你每更新employees表的时候,就执行一次,每更新一次employees表我就给你插入一下,create or replacetrigger,然后叫update emp这个表的,trigger,然后你是想还是之后,之后after,after update on,employees这个表,然后你是每一行都要这样操作吗,是的话就写false,for each row,然后呢你想干什么,你想干什么,你想干什么就写begin,后边让他去执行,begin,dbms_output.put_line,每执行一次就让你输出helloworld,end结束create or replace trigger update_emp_triggerafterupdate on employeesfor each rowbegindbms_output.put_line('helloworld');end;

创建好了,创建好了你在这看,当你每次对employees表进行Update的时候,我就触发这个事件,update employees set salary = salary + 100;我要这样写的话所有的都执行了,比如where department_id = 80,80号部门的全增加100,当你一执行update,他就触发他的事件

80号部门有34个人,然后你可以trigger1,当你update他的时候,不让你每行都执行,就是最后执行一下,把这个给他去掉create or replace trigger update_emp_trigger1afterupdate on employeesbegindbms_output.put_line('helloworld');end;

然后执行这个,就一条update employees set salary = salary + 100 where department_id = 80

34条update,但是只输出一个,这个就是叫触发器,实际上你没有调触发器,触发器是自动执行的28. 触发器的 helloworld: 编写一个触发器, 在向 emp 表中插入记录时, 打印 'helloworld'create or replace trigger emp_trigger
after
insert on emp
for each row
begindbms_output.put_line('helloworld');
end;当你每插入的时候让你执行,刚才我们创建的叫update,你创建这个触发器,仅仅你这个update的时候有效,假设你要给他insert一条数据的时候,无效的,这个表太大了,insert的时候听呕心的,我创建一条吧,create table emp,as select employee_id,salary,email from employeescreate table emp1asselect employee_id,salary,email from employeeswhere department_id = 80

创建了一个table,然后我创建一个触发table的一个触发器,然后让他作用在emp1上,这个触发器,仅仅这个表的update操作create or replace trigger update_emp_trigger1afterupdate on emp1begindbms_output.put_line('helloworld');end;

改个名trigger2create or replace trigger update_emp_trigger2afterupdate on emp1begindbms_output.put_line('helloworld');end;

当你update,emp1,set salary = salary + 100,就这样update emp1 set salary = salary + 100;

我们这个是语句及的,当你想执行比如说insert,insert操作你看会不会触发,添加了,并没有导致触发器的执行insert into emp1values (1001,20000,'aa@gmail.com');

因为你是插入的,插入操作不会触发他,你要想触发你得有一个insert的,insert on这个表create or replace trigger insert_emp_trigger3afterinsert on emp1begindbms_output.put_line('helloworld');end;

这个创建好了,来一个1002吧insert into emp1values(1002,20000,'aa@gmail.com')

我insert就触发他了,这个我们就往下走吧29. 行级触发器: 每更新 employees 表中的一条记录, 都会导致触发器执行create or replace trigger employees_trigger
after
update on employees
for each row
begindbms_output.put_line('修改了一条记录!');
end;语句级触发器: 一个 update/delete/insert 语句只使触发器执行一次create or replace trigger employees_trigger
after
update on employees
begindbms_output.put_line('修改了一条记录!');
end;没更新就触发他,这个我们已经说了30. 使用 :new, :old 修饰符create or replace trigger employees_trigger
after
update on employees
for each row
begindbms_output.put_line('old salary: ' || :old.salary || ', new salary: ' || :new.salary);
end;有一个这个概念,冒号new,冒号old,当你update一个表的时候,冒号old,比如我想update salary,工资都涨一百,那么涨一百以后,我想看看旧的工资是多少,我们就可以使用这两个符号,你看这个,这里边的2跟3是我们刚创建的,这个是作用在emp1的,进行update的

select * from emp1;这是这个表的信息

然后我现在update他,我先改一下触发器,这里有触发器,怎么改,作用在每一行上,不打印这个了,打印当你update的时候,旧的那个值,新的值没有打出来,old:salary,这是字符串,双竖线冒号,old.salary,后面new salary,冒号new点salary,输出一下update之前的那个值,和之后的值create or replace trigger update_emp_triggerafterupdate on emp1for each rowbegindbms_output.put_line('old:salary'||:old.salary||','||'new salary:'||:new.salary);end;

创建好了,创建好了以后,update,emp1,set,salary = salary +100,这是个旧的,2万加上100以后的update emp1 set salary = salary + 100;

那这个很有用,我可以把更新之前的值和之后的值都获取到,如果你只想要旧的,为啥说他挺好,你看这个题31. 编写一个触发器, 在对 my_emp 记录进行删除的时候, 在 my_emp_bak 表中备份对应的记录1). 准备工作:create table my_emp as select employee_id id, last_name name, salary sal from employeescreate table my_emp_bak as select employee_id id, last_name name, salary sal from employees where 1 = 22).
create or replace trigger bak_emp_triggerbefore delete on my_empfor each rowbegininsert into my_emp_bak values(:old.id, :old.name, :old.sal);
end; 编写一个触发器,在堆这个表进行删除的时候,在这个表当中再进行对应备份表的记录,这边在删除,实际上他导致了触发器的执行,触发器你删一条我就加一条,你删完了我就给你复制过来了,当然前提现在有两个表,这个表的所有数据都拿过来了create table my_empasselect employee_id,salary from employees

我这个时候select * from my_emp;

create table my_emp_bakasselect employee_id,salary from employees where 1=2

当你这个时候select * from my_emp_bak;这个表是空的

这个表有,这个表没有,我现在呢,当你把这个表清空的时候,create or repalce trigger,delete emp表的时候,before,delete,on my_emp,for each row,begin,怎么执行,当你一删除这个表的时候,我就insert into,my_emp_bak,values,这个表的表结构,怎么获取到,冒号old点employee_id,逗号冒号,这样的,能看懂不,当你一删除的,删除的时候就触发这个,我就把你这个old,你要删的表的旧的信息添加到新表里create or replace trigger delete_emp_triggerbeforedelete on my_empfor each rowbegininsert into my_emp_bakvalues(:old.employee_id,:old.salary);end;

delete from my _emp;清空

这个时候select * from my_emp;

select * from my_emp_bak;

就是你刚刚删的,这个就是触发器,然后你这个时候要给他commitcommit;

触发器就是这样的,它是自动给你执行的,看不到,整个就讲完了PL/SQL,大家你需要掌握的,实际上是这两个,前面的都集成到这里了

plsql(轻量版)_触发器相关推荐

  1. plsql(轻量版)_基本语法

    ORACLE的组件也可以用PL/SQL去写,后边有存储过程,存储函数,触发器,可以自己来写存储过程,或者叫触发器,那前面有哪些我们就走一走,这里实际上是一本小书了,59页,比较经典版的plsql,我们 ...

  2. plsql(轻量版)_记录类型2

    PL/SQL这一块,整个这一块需要大家掌握什么,就是他基本的格式,PL/SQL,基本的语法格式,如何声明一个变量,然后程序从哪里执行,执行的格式是什么,出现异常怎么处理,基本的语法格式,就这样写吧,第 ...

  3. plsql(轻量版)_异常处理机制

    一个优秀的程序都应该能够正确的处理各种出错异常,并尽可能的从错误中恢复,ORACLE提供异常来实现错误处理,异常exception这个词还是这个,处理正常执行过程中未预料的事件,他分为预定义的错误,和 ...

  4. plsql(轻量版)_游标的使用2

    游标你们记得,它是处理多行数据的,有点类似于集合里面的迭代器一样,一条条给你遍历打印一下,这个也是给他取出一条条的数据,就要使用到游标14. 利用游标, 调整公司中员工的工资: 工资范围 调整基数0 ...

  5. plsql(轻量版)_游标的使用1

    叫游标的使用,游标,以前没有听过这个名,什么是游标,他的作用是什么,如何来声明,怎么来使用,主要是你要掌握他是干嘛的,怎么用,游标,在PL/SQL程序当中,对于处理多行记录的事务,经常使用游标来实现, ...

  6. plsql(轻量版)_流程控制

    记录类型百分号type,使用它的优点,所引用的数据库列的数据类型不必知道,要不你就得知道它的类型和他的一样的,这里你可以实时改变,列的数据类型改变,我这里也跟着改,动态的来获取你的类型 这里还有个百分 ...

  7. plsql(轻量版)_记录类型1

    定义变量,变量类型的,这个是可变的 这里涉及到一个概念叫记录类型,记录类型是把逻辑相关的数据作为一个单元存储起来,称作一个record,其作用是存储互不相同但逻辑相关的信息,这个叫记录类型,这个是以什 ...

  8. plsql轻量版触发器

  9. plsql(轻量版)-存储函数存储过程

    ORACLE提供可以把PL/SQL程序存储在数据库中,并可以在任何地方运行他,这样就叫做存储过程或者函数,意思就说白了,就是你之前写的select,什么update,这些东西存储起来,我想把这些操作存 ...

最新文章

  1. GNU make manual 翻译( 一百一十九)
  2. SQL数据分析概览——Hive、Impala、Spark SQL、Drill、HAWQ 以及Presto+druid
  3. Leetcode376摇摆序列--贪心+自动机
  4. 我的工作日志 2020年12月1日 星期一
  5. 计算机在岗位上的应用,计算机岗位应用论文.doc
  6. 当兵的目标和计划_“士兵计划”与我的那些事儿——【初试篇】
  7. python是什么类型的编程语言-2.python是什么编程语言。
  8. asp.net 将ppt,word转化为pdf实现在线浏览详解
  9. 智能优化算法应用:基于麻雀搜索算法PID参数优化 - 附代码
  10. docker 部署 redmine 项目管理软件
  11. 内联初始化字段与类实例构造器
  12. 怎么用python下载网易云_如何使用python批量下载网易云音乐的免费音乐
  13. 【Java基础知识 8】String、StringBuilder、StringBuffer详解
  14. 维宏控制卡win7 驱动_雕刻机专用维宏5.55运动驱动控制卡
  15. python将网页转换为图片保存
  16. Vbox安装增强功能
  17. 华为交换机常见VLAN操作
  18. ubuntu下解决微信不能发送图片的问题
  19. 成都涌现大量网游业创业团队:从业人员近3万(网游亦可创业)
  20. 带上传文件功能的写CSDN博客并发表

热门文章

  1. 什么是REST?以及RESTful的实现(转)
  2. 企业级控件库之大数据量分页控件 (非原创)
  3. C#中Dictionary的用法
  4. HashMap以及ConcurrentHashMap(volatile)
  5. AIMS/MapGuide API二次开发从入门到精通视频课程系列--2
  6. jQuery实现的简单分页功能的详细解析
  7. GitLab安装配置使用总结
  8. 二层交换机的MAC表学习过程
  9. android viewpager 底部tabhost,FragmentTabHost+ViewPager实现底部导航栏
  10. linux命令last格式,Linux中aulast命令起什么作用呢?