一、函数或过程的选择
    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;else return -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;else return -1;end if;end;/declareres number;beginres:=sgnsal(7369,7788);if res=1 thendbms_output.put_line('前面的大');elsif res=0 thendbms_output.put_line('一样大');else dbms_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;  

二十一、Oracle学习笔记:编写函数和触发器相关推荐

  1. Oracle学习笔记 字符集概述

    Oracle 学习笔记 字符集概述 这节课开始讲oracle里面的字符集 偏重于原理和简单的一些判断以及实现 字符集它涉及到很多的东西 比如建库和操作系统环境 这节课把字符集的原理性的东西以及常见的操 ...

  2. oracle学习笔记 参数文件及数据库的启动和关闭

    oracle学习笔记 参数文件及数据库的启动和关闭 我们这节课把oracle的参数文件以及oracle的启动关闭讲一下 一)参数文件作用 先看oracle的参数文件 它由来已久了 我们知道oracle ...

  3. python函数是一段具有特定功能的语句组_Python学习笔记(五)函数和代码复用

    本文将为您描述Python学习笔记(五)函数和代码复用,具体完成步骤: 函数能提高应用的模块性,和代码的重复利用率.在很多高级语言中,都可以使用函数实现多种功能.在之前的学习中,相信你已经知道Pyth ...

  4. oracle update单引号,Oracle学习笔记:update的字段中包括单引号

    平时update的时候直接更改字段内的值,例如: update table_temp set name = 'Hider' where id = 100; 但更新后的值中包括单引号,则不能按以上方式进 ...

  5. php中声明一个函数,php学习笔记之 函数声明

    /* 函数定义: * 1.函数是一个被命名的 * 2.独立的代码段 * 3.函数执行特定任务 * 4.并可以给调用它的程序返回一个值 * * 函数的优点: * 1.提高程序的重用性 * 2.提高程序的 ...

  6. 在大量数据迁移期间oracle学习笔记

    在数据迁移期间oracle学习笔记 0主键(自增) 1用户代码 2区域代码 3承保公司代码 4理赔编码 5投保确认码 6案件状态 7案件进展 8重开案件进展 9转换后案件状态 需求分析: 1.根据上述 ...

  7. Matlab学习笔记 figure函数

    Matlab学习笔记 figure函数 matlab中的 figure 命令,能够创建一个用来显示图形输出的一个窗口对象.每一个这样的窗口都有一些属性,例如窗口的尺寸.位置,等等.下面一一介绍它们. ...

  8. JAVA学习笔记五---函数

    JAVA学习笔记五---函数 5.1 方法的学习 编写一个程序,求圆的周长和面积. package practice; /*** 编写一个程序,求圆的周长和面积.* @author iszhangyo ...

  9. oracle学习笔记 Oracle体系结构概述

    oracle学习笔记 Oracle体系结构概述 从这节开始,开始讲oracle数据库体系结构. 首先从总体上,从概述上把oracle整体的体系结构讲一下, 然后接下来的时间我们会一块一块的将oracl ...

  10. Revit二次开发学习笔记

    Revit二次开发学习笔记1 20220314: 概念:Application与Document 接口函数:IExternalCommand.ActiveView与Selection 20220316 ...

最新文章

  1. 习题4-3 求分数序列前N项和 (15 分)
  2. IDEA 在线翻译插件
  3. xcode新版本single view_动态数组函数系列1|概况-跟以往Excel版本完全不一样玩法的函数...
  4. 如何多快好省的建设企业级呼叫中心(一)
  5. Image.Save()发生“GDI+ 中发生一般性错误”
  6. python 入门学习篇(一),呵呵呵
  7. qq群 html,我的群组-普通群组.html
  8. CentOS Linux 7.7 安装kafka zookeeper
  9. git tag怎么使用_GIT中tag使用,打版本必备
  10. linux命令fsck和fcsk,在ubuntu中shutdown和reboot的各参数的作用是什么? | 星尘
  11. lisp如何将度分秒转换为弧度_重磅干货!如何利用Stata进行空间冷热点分析 | 社论前沿...
  12. CNN——学习率LR的参考值范围是符合指数函数的增长规律的
  13. lammps计算的应力的方法
  14. Windows网络编程:阻塞模式下的Socket编程
  15. 傲腾服务器系统,服务器加傲腾内存
  16. mysql replace rpad_mysql中的replace,concat,cast等等字符串函数
  17. 免费云笔记软件哪个好?
  18. Ureport2小计和合计功能
  19. 这款小巧精致的 Keychron K7 满足了我对键盘的所有想象
  20. 多开分身苹果版_苹果手机最新微信分身怎么下载?微信多开地址分享

热门文章

  1. Swift - 43 - 继承, 多态, 析构函数
  2. IIS的Server Application Error报错解决方法
  3. 孙鑫VC学习笔记:第二十讲 (一) Hook编程
  4. cxgrid 列显示格式右对齐_Excel中的单元格合并和格式合并,职场办公效率提升必备技能...
  5. 拓端tecdat|R语言在地图上绘制散点饼图可视化
  6. 计算机网络技术自谋职业,过去认知或许都是错的 主编告诉你游戏PC该怎么选
  7. 路由器与交换机怎么插线_网络设备:中继器、集线器、网桥、交换机、路由器、网关的超全总结!...
  8. RED-Net神经网络
  9. Linux复习-硬盘相关知识点
  10. [2] 图像处理之----二值化处理