当前位置 > 主页 > 万和大讲堂 >


南京OCP培训 Oracle数据库中的函数,包和触发器

2015-11-26 11:01

  Oracle数据库中的函数,包和触发器

 

  函数:

 

  函数和存储过程非常的相似,唯一的不同就是函数具有返回值。而存储过程是没有返回值的。南京Oracle认证培训

 

  函数的定义:

 

  在pL/Sql developer工具左侧选择“Function”,右键新建就行。在弹出的框中输入函数名和返回值(返回值是必须的),参数可以不写。定义如下,创建一个无参的函数:

 

  [sql]

 

  /**

 

  函数和存储过程非常的相似,唯一的不同的就是函数有返回值。南京Oracle认证培训

 

  **/

 

  create or replace function firstFun return varchar2

 

  is

 

  begin

 

  return 'Hello World';

 

  end firstFun;

 

  创建一个有参数的函数:

 

  [sql]

 

  /**

 

  计算年薪是多少?

 

  **/

 

  create or replace function paramFun(salary number) return  number

 

  is

 

  begin

 

  return salary*12;

 

  end paramFun;

 

  在begin中的写法和存储过程一样。

 

  函数的运行和存储过程的一样。

 

  包的介绍:

 

  包的组成:

 

  包头(package):包头部分申明包内数据类型,常量,变量,游标,子程序和异常错误处理,这些元素为包的公有元素。

 

  包主体(package body):包主体则是包定义部分的具体实现,它负责为包头中所声明子程序提供具体的实现,在包主体中还可以声明包的私有元素。

 

  包头和包主体分开编译,并作为两个分开的对象分别存放在数据库字典中。南京OCP培训

 

  创建方法:

 

  在开发工具PL/SQL Developer左侧有Packages右键点击新建。输入name值,创建包。会出现两个编辑框。一个是头一个是主体,区别图标不一样。南京Oracle认证培训

 

  一个简单的入门案例:

 

  [sql]

 

  /**

 

  这里是包头,主要是对数据的定义

 

  **/

 

  create or replace package firstPack is

 

  --定义一个变量

 

  v_bonus number:=200;

 

  --定义一个函数

 

  function yearSalary(salary number) return number;

 

  --定义一个存储过程

 

  procedure myrop;

 

  end firstPack;

 

  [sql]

 

  /**

 

  包主体:对申明的实现

 

  计算年薪

 

  年薪=月薪*12+奖金

 

  **/

 

  create or replace package body firstPack is

 

  --对包头申明函数的实现   南京OCP培训

  

  function yearSalary(salary number) return number

 

  is

 

  begin

 

  return salary*12+v_bonus;--这里用到了前面申明的变量

 

  end;

 

  --对存储过程的实现

 

  procedure myrop is

 

  begin

 

  --向学生表插入一条数据

 

  insert into tab_stu(stu_id,stu_name,stu_age,class_id) values(9,'凯南',21,2);南京OCP培训

 

  commit;

 

  end;

 

  end firstPack;

 

  Oracle中的触发器:

 

  触发器定义:

 

  触发器是在数据库里以独立的对象存储,它与存储过程不同的是当然也就是和函数的不同。存储过程需要其他程序来启动运行或直接启动,而触发器是由一个事件来启动的。

 

  即触发器是当某个事件发生时自动化的隐式运行。并且,触发器不能接受参数。所以触发器就叫触发或点火。

 

  Oracle事件值的是对数据库的表进行的insert,update及delete操作或对视图进行类似的操作。Oracle将触发器的功能扩展到了DDL(数据库定义语言)触发,包括数据库启动与关闭等系统事件。南京OCP培训

 

  就像xml解析的一种Sax解析,也是基于事件驱动的。

 

  触发器的种类(三种):

 

  DML触发器:

 

  Oracle可以在DML语句进行触发,可以在DML修改前或后进行触发,并且可以对每个行(行级)或语句操作上进行触发。(insert,update,delete)

 

  替代触发器:

 

  这是一种专门为视图操作的一种触发器,用的很少。

 

  系统触发器:

 

  可以在Oracle数据库系统的事件中进行触发,如执行DDL或Oracle系统启动与关闭等系统事件。使用也比较少。

 

  创建触发器:

 

  在PL/SQL Developer的左侧找到triggers,右键新建触发器:弹出框如下,每个框都有说明:

 

  before和after指出触发器的触发时序分别是前触发和后触发方式,前触发是在执行触发事件之前触发当前所创建的触发器,后触发式在执行触发事件之后执行当前创建的触发器。就有点像Spring的Aop编程的advice,前置通知和后置通知。

 

  for each row:表示触发器是行级触发器。行级触发器和语句触发器的区别在:行级触发器要求当一个DML语句操作影响数据库中的多行数据时,对于其中的每一个数据行,只要他们符合触发约束条件,均激活一次触发器。而语句级将整个语句操作作为触发事件,当它符合约束条件时,激活一个触发器。南京OCP培训

 

  Row:为语句级触发。  。在例子中会说明。

 

  看一下示例:

 

  [sql]

 

  /**

 

  创建一个触发器't_back_tab_sut'

 

  当表tab_stu中的记录执行删除操作之后执行

 

  **/

 

  create or replace trigger t_back_tab_sut

 

  after delete on tab_stu

 

  --当行级触发器被触发时,如果要访问插入,更新或删除的记录中的值。可以使用

 

  --NEW:访问操作完成后的值。

 

  --Old:访问操作完成前的值。

 

  --也就是可以取到你插入或更新或删掉的新或旧的数据。南京OCP培训

 

  referencing  new as new  old as old

 

  for each row --表示触发器是行级触发器

 

  declare

 

  r_tab_stu tab_stu%rowtype;

 

  begin

 

  --取到删除后的数据

 

  r_tab_stu.stu_id:=:old.stu_id;

 

  r_tab_stu.stu_name:=:old.stu_name;

 

  r_tab_stu.stu_age:=:old.stu_age;

 

  r_tab_stu.class_id:=:old.class_id;

 

  --插入到备份表中

 

  insert into tab_stu_back2(stu_id,stu_name,stu_age,class_id)

 

  values(r_tab_stu.stu_id,r_tab_stu.stu_name,r_tab_stu.stu_age,r_tab_stu.class_id);

 

  --这里不能有commit语句

 

  --因为如果这里有commit的话,那用户执行的delete操作就不能回滚了。

 

  --可以理解为这里的insert和用户的delete语句是一个事务。

 

  end t_back_tab_sut;

 

  当删除tab_stu中的数据,就会备份到tab_stu_back2表中。南京OCP培训


最近开班 more>
  • Web前端开发
  • 软件测试
  • 软件测试预科班
  • AI大模型+全栈开发开班
  • 云原生精英班
  • 云网预科班
  • 开发课程基础班第三期
  • 开发课程基础班第二期
  • 开发课程基础班第五期
  • Java全栈
  • CISP
  • HCIP-cloud
  • HCIE-Datacom(HCIA,HCIP基础)
  • HCIP-Datacom(HCIA基础)
  • HCIA-Datacom(0基础)
  • HCIE-Datacom(HCIA,HCIP基础)
  • HCIP-Datacom(HCIA基础)
  • HCIA-Datacom(0基础)
  • OCP 19C
  • RHCA
  • 6月9日
  • 5月21日
  • 5月14日
  • 6月9日
  • 5月7日
  • 5月26日
  • 5月19日
  • 5月12日
  • 6月3日
  • 6月9日
  • 随时开课
  • 7月12日
  • 5月19日
  • 5月19日
  • 5月7日
  • 5月10日
  • 5月24日
  • 5月24日
  • 随时开课
  • 随时开课
    • 姓 名 :
    • 电 话 :
    • 课 程 :

技术交流群

  • Java大数据交流群560819979加入
  • Python技术交流群595083299加入
  • Oracle技术交流群595119011加入
  • Web前端技术交流群604697610加入
  • Huawei技术交流群482919361加入
  • Redhat技术交流群587875348加入
  • UI设计技术交流群511649801加入
  • Cisco技术交流群596886705加入
  • IT运维技术交流群605888381加入