300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 二十一 Oracle学习笔记:编写函数和触发器

二十一 Oracle学习笔记:编写函数和触发器

时间:2018-10-22 04:03:20

相关推荐

二十一 Oracle学习笔记:编写函数和触发器

一、函数或过程的选择

1.如果要进行DML(增删改),选择存储过程

2.如果没有DML,选择函数

二、函数

1.格式

create or replace function 函数名(参数1 类型,参数2 类型, 。。。)return 类型is--变量声明区begin--业务逻辑区return 值;end;/

2.实例

--练习,山寨sign函数:--逻辑:判断某一个数,如果>0,就返回1,--如果<0,返回-1,如果=0,就返回0;create or replace function sgn(a number)return numberisbeginif a>0 thenreturn 1;elsif a=0 thenreturn 0;elsereturn -1;end if;end;/--select sgn(5) from dual;declareres number;beginres:=sgn(10);if res>0 thendbms_output.put_line('正数');end if;end; /--练习:比较两个员工的工资高低create or replace function sgnsal(id1 number,id2 number)return numberissal1 number;sal2 number;beginselect sal into sal1 from emp where empno=id1;select sal into sal2 from emp where empno=id2;if sal1>sal2 thenreturn 1;elsif sal1=sal2 thenreturn 0;elsereturn -1;end if;end;/declareres number;beginres:=sgnsal(7369,7788);if res=1 thendbms_output.put_line('前面的大');elsif res=0 thendbms_output.put_line('一样大');elsedbms_output.put_line('后面的大');end if;end;/--练习:根据部门号计算部门的总工资create or replace function total(dno number)return numberistotalsal number;beginselect sum(sal) into totalsal from emp where deptno=dno;return totalsal;end;/ select total(10) from dual;

函数的参数类型也和存储过程一样规则

--练习:返回两个数a,b的和,并返回这两个数create or replace function abtotal(a in out number,b in out number)return numberisbeginif a is null thena:=1;end if;if b is null thenb:=1;end if;return a+b;end;/declaretotal number;a number;b number:=10;begintotal:=abtotal(a,b);dbms_output.put_line(total);dbms_output.put_line(a);dbms_output.put_line(b);end; /

三、触发器

1.定义:是ORACLE在发生某些事件时,可以自动触发并调用的PLSQL程序,可以定义在事件上,由事件自动触发。

2.分类:

(1)系统触发器

由系统时间触发的PLSQL程序,比如登录ORACLE\登出ORACLE

(2)DML触发器

由DML语句触发的PLSQL程序,如增删改

3.DML触发器

(1)语句级触发器

如果执行完一条DML语句后,希望对整张表的数据进行预算,使用语句级触发器,这种触发器是在DML执行前/执行后触发的。

--格式:--注意:触发器是自己调用的,不需要调用create or replace trigger 触发器名before|after insert|update|delete on 表declare声明变量begin处理业务end;/

--练习:在进行任何增删改操作后,计算出员工数,员工总薪资,员工平均工资create or replace trigger mmpafter insert or update or delete on empdeclarecountEmp number;totalSal number;avgSal number;beginselect count(*),sum(sal),trunc(avg(sal),2) into countEmp,totalSal,avgSal from emp;dbms_output.put_line('总人数 '||countEmp);dbms_output.put_line('总工资 '||totalSal);dbms_output.put_line('平均工资'||avgSal);end;/update emp set sal=2500 where empno=7369;drop trigger mmp;

(2)行级触发器

如果在执行DML时,希望对当前操作的数据进行处理,那么可以使用行级触发器,行级触发器也是在执行DML之前/之后自动触发的,在行级触发器中可以使用行变量,引用到DML所操作的数据,这个行变量是内置的,可以直接使用。

行变量

:new 表示引用的是新增后的行数据

:old 表示引用的是修改/删除前的行数据

规则

insert语句只有:new,表示插入后的新数据

delete语句只有:old,表示删除前的旧数据

update语句既有:new也有:old,其中

:new表示修改后的数据,

:old表示修改前的数据

--格式:create or replace trigger 触发器名before|after insert|update|delete on 表for each rowdeclare声明变量begin处理业务end;/--用法:--变量名.字段名--触发器中不能写commit

--练习:删除dept表数据之前,将删除记录存入备份表中create or replace trigger tri_deptbefore delete on dept for each rowdeclarebegininsert into dept_bak values(:old.deptno,:old.dname,:old.loc);end;/ delete from dept;select * from dept_bak;rollback;--练习:修改员工工资,显示一下之前和之后的工资set serveroutput on;create or replace trigger tri_salafter update on emp for each rowdeclarebegindbms_output.put_line('old='||:old.sal||',new='||:new.sal);end; / update emp set sal=4000 where empno=7369;

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。