二十一、Oracle学习笔记:编写函数和触发器
发布日期:2021-07-26 07:20:44
浏览次数:3
分类:技术文章
本文共 3636 字,大约阅读时间需要 12 分钟。
一、函数或过程的选择
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 number is begin if a>0 then return 1; elsif a=0 then return 0; else return -1; end if; end; /--select sgn(5) from dual; declare res number; begin res:=sgn(10); if res>0 then dbms_output.put_line('正数'); end if; end; / --练习:比较两个员工的工资高低 create or replace function sgnsal(id1 number,id2 number) return number is sal1 number; sal2 number; begin select sal into sal1 from emp where empno=id1; select sal into sal2 from emp where empno=id2; if sal1>sal2 then return 1; elsif sal1=sal2 then return 0; else return -1; end if; end; / declare res number; begin res:=sgnsal(7369,7788); if res=1 then dbms_output.put_line('前面的大'); elsif res=0 then dbms_output.put_line('一样大'); else dbms_output.put_line('后面的大'); end if; end; / --练习:根据部门号计算部门的总工资 create or replace function total(dno number) return number is totalsal number; begin select 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 number is begin if a is null then a:=1; end if; if b is null then b:=1; end if; return a+b; end; / declare total number; a number; b number:=10; begin total:=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 mmp after insert or update or delete on emp declare countEmp number; totalSal number; avgSal number; begin select 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 row declare 声明变量 begin 处理业务 end; / --用法:--变量名.字段名--触发器中不能写commit
--练习:删除dept表数据之前,将删除记录存入备份表中 create or replace trigger tri_dept before delete on dept for each row declare begin insert 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_sal after update on emp for each row declare begin dbms_output.put_line('old='||:old.sal||',new='||:new.sal); end; / update emp set sal=4000 where empno=7369;
转载地址:https://blog.csdn.net/qq_38741971/article/details/81429354 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月11日 00时29分31秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
TurtleArt美景图
2019-04-26
margin布局
2019-04-26
盒模型之border实践--三角形
2019-04-26
块状元素与内敛元素
2019-04-26
CSS控制段落和文字属性和背景
2019-04-26
Python语言开发工具
2019-04-26
Requests库的入门
2019-04-26
Robots协议
2019-04-26
Python网络爬虫的网站实例
2019-04-26
HTML学习思维导图
2019-04-26
h标签与p标签
2019-04-26
BeautifulSoup库的安装及基本元素
2021-06-29
基于bs4的HTML内容遍历方法
2021-06-29
信息标记与信息提取
2021-06-29
各大网站CSS初始化代码
2021-06-29
正则表达式的基本用法
2021-06-29
Python的Re库(正则表达式)基本用法
2021-06-29
Scrapy爬虫框架
2021-06-29
Anaconda
2021-06-29
NumPy库入门
2021-06-29