收藏 分销(赏)

Oracle数据库技术与应用(高级)课件全书电子教案教材课件.ppt

上传人:a199****6536 文档编号:10093468 上传时间:2025-04-21 格式:PPT 页数:101 大小:4.10MB
下载 相关 举报
Oracle数据库技术与应用(高级)课件全书电子教案教材课件.ppt_第1页
第1页 / 共101页
Oracle数据库技术与应用(高级)课件全书电子教案教材课件.ppt_第2页
第2页 / 共101页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,3.0,3.0,3.0,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,威迅教育开发部监制,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,3.0,3.0,3.0,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,威迅教育开发部监制,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,3.0,3.0,3.0,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,威迅教育开发部监制,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,3.0,3.0,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,威迅教育开发部监制,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,3.0,3.0,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,威迅教育开发部监制,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,第 一 章,第四章,一,PL/SQL,编程,第,章,企业,级卓越人才培养,目标,掌握,PL/SQL,语法结构,掌握数据类型的分类及变量的使用,掌握各种运算符的使用,掌握各种控制语句的使用,掌握在,PL/SQL,中进行异常处理,PL/SQL,语言,PL/SQL,是一种高级数据库程序设计语言,PL/SQL,代表面向过程化的语言与,S Q L,语言的结合,PL/SQL,将第四代语言的强大功能和灵活性与第三代语言的过程结构的优势融为一体,PL/SQL,具有编程结构、语法和逻辑机制,PL/SQL,用于在各种环境下对,Oracle,数据库进行快速高效访问,PL/SQL,语言,PL/SQL,语言内容,PL/SQL,块结构,变量与常量,数据类型,运算符,流程控制,空操作和空值,PL/SQL,块结构,PL/SQL,程序包含了一个或多个,PL/SQL,块,PL/SQL,块语法结构,DECLARE,声明部分,BEGIN,执行部分,EXCEPTION,异常处理部分,END;,PL/SQL,块结构,示例:在数据库,emp,表中修改一名雇员记录,如果没有该记录则创建一条新记录,DECLARE,v_no number(4):=8033;,-定义变量,v_name varchar2(10):=张三;,v_job varchar2(9):=SALESMAN;,BEGIN,UPDATE emp SET job=v_job WHERE empno=v_no;,-更新雇员表,IF SQL%NOTFOUND THEN,-检查记录是否存在,如不存在就插入记录,INSERT INTO emp(empno,ename,job)VALUES(v_no,v_name,v_job);,END IF;,END;,/,变量与常量,声明变量,variable_name CONSTANT datatype NOT NULL:=DEFAULT EXPRESSION,给变量赋值有两种方式,DECLARE,var1 number:=1;,/*,声明变量并初始化*,/,var2 varchar2(10);,/*,声明变量*,/,BEGIN,var2:=zhangsan;,/*,给变量赋值*,/,END;,/,变量与常量,可以通过,SELECT INTO(,或,FETCH INTO),给变量赋值,DECLARE,var1 varchar2(10);,BEGIN,SELECT ename INTO var1 FROM emp,WHERE empno=7788;,dbms_output.put_line(var1);,END;,/,变量与常量,常量:值在程序内部不能改变,声明常量必须包括关键字,CONSTANT,var1 constant number:=3;,数据类型,标量类型,属性类型,用户自定义类型,数据类型,属性类型,%type,引用表中列的类型,%rowtype,引用表中行的类型,例如:,-%type,var1 emp.ename%type;,-%rowtype,var2 emp%rowtype;,运算符,算术运算符,+,-,*,/,mod,关系运算符,=,0 THEN,NULL;,ELSE,dbms_output.put_line(,正常,);,END IF;,PL/SQL,异常处理,PL/SQL,块中可以有异常处理部分,EXCEPTION,WHEN excep_name1 THEN,WHEN excep_name2 THEN,WHEN OTHERS THEN,END;,异常有两种,预定义的异常 用户定义的异常,系统预定义异常,例:除零异常,declare,num number(3):=10;,zero number(3):=0;,result number(6);,begin,result:=num/zero;,exception,when ZERO_DIVIDE then,dbms_output.put_line(,被零除!,);,end;,用户定义异常,当部门员工数超过规定人数引发自定义异常,declare,overnumber EXCEPTION;,-,用户定义的异常,maxnum constant number:=5;,num number;,begin,select count(*)into num from emp where deptno=&,部门编号,;,if num maxnum then,RAISE overnumber;,-,使用,RAISE,语句引发自定义异常,end if;,dbms_output.put_line(,该部门雇员人数为:,|num);,exception,when overnumber then,dbms_output.put_line(,该部门雇员人数超过了规定人数!,);,end;,总结,PL/SQL,语言是面向过程语言与,SQL,语言的结合,数据在数据库与,PL/SQL,程序之间是通过变量进行传递的。变量通常是在,PL/SQL,块的声明部分定义,除了,15,种标量数据类型外,,Oracle,还提供了属性类型。并允许用户自定义类型,Oracle,中使用的运算符,流程控制语法和其他语言的类似,Oracle,中提供了异常(,Exception,)这一处理错误情况的方法。在,PL/SQL,代码部分执行过程中无论何时发生错误,控制自动地转向执行异常部分,在,PL/SQL,中可以处理系统预定义的异常,也可以使用自定义的异常,2025/4/21 周一,第四章,二,游标、集合和,OOP,的概念,第,章,企业,级卓越人才培养,21,目标,理解游标、集合的概念和作用,掌握在,PL/SQL,中游标的基本用法,了解,Oracle,数据库中,OOP,的基本概念,22,游标,PL/SQL,用游标,(cursor),来管理,select,语句,游标分类,静态游标,显式游标,(explicit cursor),隐式游标(,implicit cursor,),游标变量,23,显式游标,显式游标的使用步骤,声明游标,(declare),打开游标,(open),读取数据,关闭游标,(close),24,显式游标,声明游标,CURSOR cursor_name,IS,select_statement,示例,DECLARE,CURSOR emp_cur,IS,select ename,job,sal from emp;,25,显式游标,打开游标,OPEN cursor_name;,示例,BEGIN,OPEN emp_cur;,dbms_output.put_line(emp_cur%ROWCOUNT);,END;,26,显式游标,读取数据,FETCH cursor_name INTO variable_name,n;,示例,BEGIN,OPEN emp_cur;,FETCH emp_cur INTO name,job,sal;,/*从结果集中提取一行数据*/,WHILE emp_cur%FOUND,LOOP,dbms_output.put_line(name|job|sal);,FETCH emp_cur INTO name,job,sal;,/*在循环中每次提取一行数据*/,END LOOP;,CLOSE emp_cur;,END;,27,显式游标,关闭游标,CLOSE cursor_name;,示例,BEGIN,CLOSE emp_cur;,END;,28,显式游标,游标的属性,%FOUND,检测当前游标指向的行是否有数据,%NOTFOUND,与,%FOUND,相反,%ROWCOUNT,从游标中已提取的总行数,%ISOPEN,检测游标是否已打开,29,隐式游标,在,PL/SQL,程序段中使用,SELECT,语句进行操作,,PL/SQL,语言会隐含地处理游标定义,示例:,DECLARE,name varchar2(10);,BEGIN,select ename into name from emp,where empno=7934;,dbms_output.put_line(name);,END;,30,隐式游标,使用隐式游标要注意以下几点,每个隐式游标必须有一个,INTO,INTO,接受的变量类型要与列表的一致,隐式游标一次仅能返回一行数据,使用时必须检查异常。最常见的异常有“,no_data_found”,和“,too_many_rows”,31,游标变量,游标变量是动态的,它不与特定的查询绑定在一起。可以为任何兼容的查询打开游标变量,从而提高更好的灵活性。,创建游标变量有两个步骤:,定义,REF CURSOR,类型,即引用游标类型,声明这种类型的游标变量,32,游标变量,声明一个引用游标类型,-,强类型游标(指定返回类型),TYPE dept_cur IS REF CURSOR,RETURN dept%rowtype;,-,弱类型游标(没有返回类型),TYPE mycur IS REF CURSOR;,33,游标变量,声明游标变量,DECLARE,TYPE dept_cur IS REF CURSOR,RETURN dept%rowtype;,cur1 dept_cur;,/*声明游标变量*/,打开游标变量,OPEN cur1 FOR,select*from dept where deptno=10;,34,游标变量,示例,DECLARE,TYPE dept_cur IS REF CURSOR RETURN dept%rowtype;,cur1 dept_cur;,dept1 dept%rowtype;,BEGIN,OPEN cur1 FOR select*from dept where deptno=10;,FETCH cur1 INTO dept1;,dbms_output.put_line(dept1.deptno|dept1.dname|dept1.loc);,OPEN cur1 FOR select*from dept where dname=SALES;,FETCH cur1 INTO dept1;,dbms_output.put_line(dept1.deptno|dept1.dname|dept1.loc);,CLOSE cur1;,END;,35,集合,集合类似于其他第,3,代语言中使用的数组,PL/SQL,语言提供了,3,种不同的集合类型,联合数组(也称为索引表),嵌套表,可变数组,36,联合数组,联合是具有,Oracle,的数据类型或用户自定义类型的一维体,声明联合数组的语法格式,TYPE table_type,IS,TABLE OF type INDEX BY binary_integer;,37,联合数组,联合数组示例,DECLARE,TYPE emp_name IS TABLE OF varchar2(10);,/*,声明类型*,/,INDEX BY binary_integer;,names emp_name;,/*,声明变量*,/,BEGIN,names(1):=,张飞,;,names(2):=,关羽,;,END,38,嵌套表,嵌套表和联合数组类似,唯一不同是没有,INDEX BY binary_integer,子句,嵌套表使用前需要初始化,DECLARE,TYPE stutab IS TABLE OF varchar2(20);,stu stutab:=stutab(,张三,李四,王五,);,BEGIN,for i in 1.3 loop,dbms_output.put_line(stu(i);,end loop;,END;,39,可变数组,可变数组的语法格式如下:,TYPE type_name,IS,VARRAY|VARYING ARRAY,(max_size)OF element_type NOT NULL,40,可变数组,可变数组也需要初始化。需要注意赋值的数量必须保证不大于可变数组的最大上限,DECLARE,TYPE montharr IS VARRAY(12)OF varchar2(10);,months montharr:=montharr(January,February,March);,BEGIN,months.extend(2);,/*,给,months,可变数组增加两个元素*,/,months(4):=April;,months(5):=June;,FOR i IN 1.5 LOOP,dbms_output.put_line(months(i);,END LOOP;,END;,41,OOP,的概念,自,Oracle9i,以来,,Oracle,不再是单纯的关系数据库管理系统了,它在关系数据库模型的基础上,添加了一系列面向对象的特性,其主要目的是把用户类型直接映射到数据库的类型,从而方便编程。,Oracle,面向对象的最基本元素是它的对象类型,也就是,Type,Oracle,中与面向对象技术相关的数据类型主要有:对象类型,可变数组,嵌套表,对象表,对象视图等,42,OOP,的概念,使用对象数据类型的优点:,更容易与,Java,、,C+,编写的对象应用程序交互。,获取便捷。一次对象类型请求就可以从多个关系表中获取信息,通过一次网络往复即可返回。,可以把对象数据类型理解为在,OOP,语言中的类。创建一个对象数据类型相当于创建一个类,以后我们可以实例化,继承等等,43,总结,显式游标用于处理返回一到多行结果集的,select,语句,显式游标首先要声明,在使用前要打开,使用完要关闭。,隐式游标即简单地编码,select,语句。当,select,语句预计只返回一行时使用隐式游标。,使用游标变量需要先声明引用游标类型,再定义该种类型的游标变量。它不与特定的查询绑定在一起,而是可以动态地打开不同的查询。处理结果集的方式与显式游标基本相同。,集合包括:联合数组、嵌套表、可变数组,它们都是以数组的方式操纵数据,可以使用集合在,PL/SQL,中完成一些复杂的操作。,Oracle,数据库是一种对象关系型数据库,它在关系型数据库的基础上加入了面向对象的概念,2025/4/21 周一,第 三 章,第四章,三,存储过程和函数,第,章,企业,级卓越人才培养,45,目标,理解子程序的概念和作用,掌握使用,PL/SQL,语言创建和调用存储过程和函数,掌握在,Java,语言中调用存储过程和函数,掌握事务在子程序中的应用,46,概述,PL/SQL,块主要有两类:命名块和匿名块,匿名块,(,以,DECLARE,或,BEGIN,开始,),每次使用都要编译,并且不能从其他地方调用,命名块也叫做子程序或过程,主要有三类:,存储过程,函数,程序包,47,概述,子程序有如下一些优点:,执行速度快,提高系统性能,确保数据库的安全,允许自动执行,本章主要介绍命名块结构,包括过程和函数。以及在过程(函数)应用数据库事务,48,存储过程,主要内容,创建过程,调用过程,过程的语法,过程的参数模式,过程中的异常处理,过程的修改和删除,49,创建过程,如果要经常性对表实施插入操作,可以使用存储过程以提高执行效率,CREATE OR REPLACE PROCEDURE addUser(,p_id Users.id%type,p_name Users.uname%type,p_pwd Users.pwd%type,)AS,BEGIN,insert into Users(id,uname,pwd)values(p_id,p_name,p_pwd);,commit;,END addUser;,50,调用过程,执行存储过程的语法格式,EXECUTE procedure_name (parameter,n),执行存储过程插入记录,SQL EXEC addUser(0001,zhangsan,zhang01);,51,调用过程,在,PL/SQL,块中调用存储过程,DECLARE,v_id Users.id%type:=0002;,v_name Users.uname%type:=lisi;,v_pwd Users.pwd%type:=li02;,BEGIN,addUser(v_id,v_name,v_pwd);,END;,52,过程的语法,CREATE PROCEDURE,用于创建存储过程,CREATE OR REPLACE PROCEDURE schema.proc_name,(parameter parameter_mode datatype,.n),IS|AS,local_declaration,BEGIN,sql_statement,EXCEPTION,exception_handler,END procedure_name;,53,过程的参数模式,过程的形参有三种模式:,IN,OUT,IN OUT,IN,参数:输入型参数,,IN,模式的参数在传递时,实参可以是变量,也可以是常量,EXEC addUser(0001,zhangsan,zhang01);,/*实参为常量*/,-,或者,addUser(v_id,v_name,v_pwd);,/*实参为变量*/,54,过程的参数模式,OUT,参数:输出型参数。通过,OUT,参数可以在过程调用后获得一个返回值,示例:,/,*,计算指定部门中,工资在,1500,元以上的员工人数*,/,CREATE PROCEDURE countSal(,p_deptno IN emp.deptno%type,/*in,参数*,/,p_count OUT number,/*out,参数*,/,)AS,BEGIN,select count(*)into p_count from emp,where sal=1500 and deptno=p_deptno;,END countSal;,55,过程的参数模式,调用带,OUT,参数的存储过程(实参只能是变量,不能是常量),DECLARE,v_deptno emp.deptno%type;,v_count number;,BEGIN,v_deptno:=&,部门编号,;,/*,输入一个部门编号*,/,countSal(v_deptno,v_count);,/*,调用存储过程*,/,dbms_output.put_line(,人数为:,|v_count);,END;,56,过程的参数模式,IN OUT,参数:输入输出型参数。这是一种最灵活的方式,该类型是,IN,和,OUT,的组合。,IN OUT,参数的实参既可以传值给过程,又可以从过程获得返回值。,调用时实参只能是变量,不能是常量,57,过程中的异常处理,为了不让存储过程因为出现异常而终止执行,可以在过程中进行异常处理,CREATE OR REPLACE PROCEDURE findEmp(,p_empno IN emp.empno%type,p_ename OUT emp.ename%type,)AS,BEGIN,select ename into p_ename from emp,where empno=p_empno;,EXCEPTION,when NO_DATA_FOUND then,p_ename:=null;,END;,58,过程的修改和删除,过程的修改,仍然使用,create or replace procedure,命令,CREATE OR REPLACE PROCEDURE countSal(,p_count OUT number,/*out,参数*,/,)AS,BEGIN,select count(*)into p_count from emp where sal=1500;,END countSal;,过程的删除,使用,drop procedure,DROP PROCEDURE countSal;,59,事务处理,事务是用于确保数据库的一致性,事务必须满足四个原则(,ACID,),原子性,(atomicity),一致性,(consistency),隔离性,(isolation),持久性,(durability),60,事务与存储过程,存储过程或许是保证事务正确的最容易、最可理解的方法,如果遵守“一个存储过程调用就是一个事务”的编程范例,可以更轻松地控制事务和建立新事务,61,事务与存储过程,示例:,/*,一个把资金从储蓄帐户转移到支票帐户的,ATM,事务*,/,CREATE OR REPLACE PROCEDURE savingsToChecking(,p_accid number,/*,指定帐户编号*,/,p_num number,/*,指定需要转帐的金额*,/,)AS,BEGIN,update accounts set balance=balance-p_num,where accid=p_accid and type=savings;,/*,资金从储蓄帐户转出*,/,update accounts set balance=balance+p_num,where accid=p_accid and type=checking;,/*,资金转入支票帐户*,/,commit;,/*,事务完成提交*,/,EXCEPTION,when others then,rollback;,/*,出现任何异常则回退该事务*,/,END;,62,函数,函数是用来计算值的的一种子程序,函数与过程在结构上很相似,不同的是函数有一条,RETURN,语句,用来返回值,63,创建函数,假设我们要查询一个用户,zhangsan,是否在,Users,表中存在,创建函数如下:,CREATE OR REPLACE FUNCTION existUser(,p_name Users.uname%type,)RETURN boolean,IS,t_count number;,BEGIN,select count(uname)into t_count from Users,where uname=p_name;,if t_count 0 then,return true;,/*,如果存在返回,true*/,else,return false;,/*,如果不存在的返回,false*/,end if;,END existUser;,64,函数的调用,在,PL/SQL,中调用函数,DECLARE,existed boolean;,BEGIN,existed:=existUser(zhangsan);,/*调用函数*/,if existed then,dbms_output.put_line(该用户存在);,else,dbms_output.put_line(该用户不存在);,end if;,END;,65,函数的语法,create function,命令用于创建函数,CREATE OR REPLACE FUNCTION schema.function_name,/*,函数名*,/,(parameter parameter_mode datatype,.n),/*,参数定义部分*,/,RETURN return_type,/*,定义返回值类型*,/,IS|AS,local_declaration,/*,局部变量声明*,/,BEGIN,function_body,/*,函数体部分*,/,RETURN expression,/*,返回语句*,/,EXCEPTION,exception_handler,/*,异常处理部分*,/,END function_name;,66,函数与过程的比较,函数和过程都是子程序,有很多相同之处。,函数和过程的区别如下:,过程,函数,作为一个,PL/SQL,语句来执行,作为表达式的一部分来调用,可以没有,RETURN,语句,必须包含,RETURN,语句,可以通过参数返回一个值,必须通过,RETURN,语句返回一个值,67,总结,Oracle,子程序是命名的,PL/SQL,块,它存放在数据字典中,可以在不同用户和应用程序之间共享。子程序包括存储过程和函数。,子程序只编译一次,并以可执行文件形式存储,因此调用过程快速而且高效。如果不考虑数据库的移植性,可以使用子程序来实现应用程序的业务逻辑。,存储过程没有返回值,但可以通过,OUT,和,IN OUT,参数返回多个值。存储过程作为一条,PL/SQL,语句来调用。,函数必须指定一个返回值,并在函数体中用,RETURN,语句来返回。在函数中使用,OUT,或,IN OUT,参数返回多个值是一种不良的编程习惯。函数是作为,PL/SQL,表达式的的一部分来调用的。,事务是用于确保数据库的一致性。事务把数据库从一个一致状态带到下一个一致状态。,事务,ACID,原则:原子性、一致性、隔离性、持久性。,事务处理的主要语句:,commit,、,rollback,。,2025/4/21 周一,第四章,四,触发器,第,章,企业,级卓越人才培养,目标,了解触发器的概念和作用,理解触发器的语法,掌握,DML,触发器和,INSTEAD OF,触发器的创建和应用,了解程序包的概念和作用,概述,触发器(,trigger,)是命名,P L/S Q L,块的第四种类型,本章重点介绍如何创建不同类型的触发器以及讨论触发器的一些应用。另外还将介绍,Oracle,中程序包的概念,触发器简介,触发器是一种过程,与表关系密切,用于保护表中的数据,当一个基表被修改(,INSERT,、,UPDATE,或,DELETE,)时,触发器自动执行,触发器可实现多个表之间数据的一致性和完整性,触发器语法,创建触发器的具体语法:,CREATE OR REPLACE TRIGGER schema.trigger_name,BEFORE|AFTER|INSTEAD OF,/*定义触发器种类*/,DELETE OR INSERT OR UPDATEOF column,n,ON schema.table_name|view_name,/*指定操作对象*/,FOR EACH ROW WHEN(condition),trigger_body,创建,DML,触发器,DML,触发器由,DML,语句激发,并且由该语句的类型决定,DML,触发器的类型,可以定义,DML,触发器进行,INSERT,、,UPDATE,、,DELETE,操作,DML,触发器可以在上述操作之前或之后激发,也可以在行或语句操作上激发,创建,DML,触发器,示例:实现自动更新专业统计信息的功能,create or replace trigger UpdateMajorStat,after insert or delete or update on student,declare,cursor cur is,/*按专业分组统计学生人数和总积分*/,select major,count(*)ts,sum(credit)tc from student,group by major;,begin,delete from major_stat;,/*先删除major_stat表中的所有记录*/,for rec in cur loop,/*将分组统计的新结果通过循环插入表中*/,insert into major_stat values(rec.major,rec.ts,rec.tc);,end loop;,end;,创建,DML,触发器,在执行,INSERT,、,UPDATE,或,DELETE,语句时,不论该语句影响了多少行,触发器都只被触发一次,这样的触发器可以称为语句级触发器(如,UpdateMajorStat,),“,FOR EACH ROW”,子 句可以指定触发器是一个行级触发器,创建,DML,触发器,行级触发器示例:当删除学生表,student,中的一条记录时,将该记录插入到,quit_stu,表中,create or replace trigger stuDelete,before delete on student,for each row /*指定行级触发*/,begin,insert into quit_stu values,(:old.id,:old.name,:old.major,:old.credit);,end;,创建,DML,触发器,伪记录“,:old”,和“,:new”,“:old”,代表操作完成前的旧记录,“:new”,代表操作完成后的新记录,在执行三种,DML,语句时“,:old”,和“,:new”,的存在情况,触发语句,:old,:new,INSERT,NULL,要插入的记录,UPDATE,更新前的记录,更新后的记录,DELETE,要删除的记录,NULL,创建,DML,触发器,使用伪记录的例子:在,emp,表中调整雇员工资,要求工资只能增加不能降低,create or replace trigger update_sal,before update of sal,/*指定当update语句修改sal列时触发*/,on emp,for each row,when(:new.sal :old.sal),/*当新的工资小于原有工资时才触发*/,begin,:new.sal:=:old.sal;,/*新的工资赋予原来的值,即工资不变*/,end;,INSTEAD OF,触发器,INSTEAD OF,触发器用于对视图的,DML,触发,主要用于多表联接的视图,例:在,dept,和,emp,表上建有如下视图,create or replace view emp_dept,as,select e.empno,e.ename,d.deptno,d.dname,from emp e,dept d where e.deptno=d.deptno;,INSTEAD OF,触发器,当在,emp_dept,视图上执行插入操作时,能够把相应的记录插入到,Dept,和,emp,表中,create or replace trigger insert_emp_dept,instead of insert on emp_dept,begin,insert into dept(deptno,dname),values(:new.deptno,:new.dname);,insert into emp(empno,ename,deptno),values(:new.empno,:new.ename,:new.deptno);,end;,触发器的修改与删除,修改触发器的内容,可以使用,CREATE OR REPLACE,语句来实现,禁用名为,log_creations,的触发器,ALTER TRIGGER log_creations DISABLE;,重新启用,log_creations,触发器,ALTER TRIGGER log_creations ENABLE;,触发器的修改与删除,删除触发器,log_creations,DROP TRIGGER log_creations;,查看所有当前用户的,trigger,:,select*from user_triggers;,总结,触发器是一种过程。触发器可实现多个表之间数据的一致性和完整性,触发器与子程序不同,它是在事件发生时隐式(自动)触发并执行,触发器的类型有,3,种:,DML,触发器,,INSTEAD OF,触发器,系统触发器,DML,触发器针对,INSERT,、,UPDATE,、,DELETE,操作,可以在这些操作之前或之后触发。,DML,触发器又包括行级触发器和语句级触发器。,INSTEAD OF,触发器主要用于
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服