资源描述
Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,*,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,Click to edit Master title style,第10章 游标、存储过程和触发器,课程描述,介绍Oracle数据库程序设计中经常会用到的3个概念,即游标、存储过程和触发器。,本章知识点,游标,存储过程管理,触发器管理,游标,游标的基本概念,游标控制语句,游标属性,游标FOR循环,游标的基本概念,游标示意图,游标的基本概念,使用显式游标,(1)声明游标。,(2)打开游标。,(3)读取数据。,(4)关闭游标。,游标的基本概念,隐式游标,【例】使用SELECT语句声明隐式游标,从HR.Departments表中读取Department_name字段的值到变量DepName:,SET ServerOutput ON;,DECLARE DepName HR.Departments.Department_Name,%Type,;,BEGIN,SELECT Department_name,INTO DepName,FROM HR.Departments,WHERE Department_ID=10;,dbms_output.put_line(DepName);,END;,类型描述符,游标控制语句,(1)声明游标语句CURSOR:,DECLARE CURSOR,(),IS,;,【例】声明一个游标MyCur,读取指定类型的用户信息:,DECLARE CURSOR MyCur(,varType NUMBER,)IS,SELECT UserId,UserName FROM Users,WHERE UserType=varType;,游标控制语句,(2)打开游标语句OPEN:,OPEN ();,【例】打开游标MyCur,读取类型为1的用户信息:,OPEN MyCur(1);,游标控制语句,(3)游标取值语句FETCH。游标取值语句FETCH的基本语法结构如下:,FETCH INTO;,【例】在打开的游标MyCur的当前位置读取数据:,FETCH MyCur INTO varI,d varName;,(4)关闭游标语句CLOSE:,CLOSE;,【例】关闭游标MyCur:,CLOSE MyCur;,游标控制语句,【例】下面介绍一个完整的游标应用实例:,/*打开显示模式*/,SET ServerOutput ON;,DECLARE -开始声明部分,varId NUMBER;-声明变量,用来保存游标中的用户编号,varName VARCHAR2(50);-声明变量,用来保存游标中的用户名,-定义游标,varType为参数,指定用户类型编号,CURSOR MyCur(varType NUMBER)IS,SELECT UserId,UserName FROM Users,WHERE UserType=varType;,BEGIN -开始程序体,OPEN MyCur(1);-,打开游标,参数为1,表示读取用户类型编号为1的记录,FETCH MyCur INTO varId,varName;,-读取当前游标位置的数据,CLOSE MyCur;,-关闭游标,dbms_output.put_line(用户编号:|varId|,用户名:|varName);-显示读取的数据,END;-结束程序体,游标属性,(1)%ISOPEN属性,【例】下面的代码演示当使用未打开的游标时,将会出现错误:,/*打开显示模式*/,SET ServerOutput ON;,DECLARE -开始声明部分,varName VARCHAR2(50);-声明变量,用来保存游标中的用户名,varId NUMBER;-声明变量,用来保存游标中的用户编号,-定义游标,varType为参数,指定用户类型编号,CURSOR MyCur(varType NUMBER)IS,SELECT UserId,UserName FROM Users,WHERE UserType=varType;,BEGIN -开始程序体,FETCH MyCur INTO varId,varName;-读取当前游标位置的数据,CLOSE MyCur;-关闭游标,dbms_output.put_line(用户编号:|varId|,用户名:|varName);-显示读取的数据,END;-结束程序体,游标属性,【例】修改上面的程序,在使用游标之前,调用%ISOPEN属性判断游标是否打开。,/*打开显示模式*/,SET ServerOutput ON;,DECLARE -开始声明部分,varName VARCHAR2(50);-声明变量,用来保存游标中的用户名,varId NUMBER;-声明变量,用来保存游标中的用户编号,-定义游标,varType为参数,指定用户类型编号,CURSOR MyCur(varType NUMBER)IS,SELECT UserId,UserName FROM Users,WHERE UserType=varType;,BEGIN -开始程序体,IF MyCur%ISOPEN=FALSE Then,OPEN MyCur(2);,END IF;,FETCH MyCur INTO varId,varName;-读取当前游标位置的数据,CLOSE MyCur;-关闭游标,dbms_output.put_line(用户编号:|varId|,用户名:|varName);-显示读取的数据,END;-结束程序体,游标属性,(2)%FOUND属性和%NOTFOUND属性,【例】%FOUND属性可以循环执行游标读取数据:,/*打开显示模式*/,SET ServerOutput ON;,DECLARE -开始声明部分,varName VARCHAR2(50);-声明变量,用来保存游标中的用户名,varId NUMBER;-声明变量,用来保存游标中的用户编号,-定义游标,varType为参数,指定用户类型编号,CURSOR MyCur(varType NUMBER)IS,SELECT UserId,UserName FROM Users,WHERE UserType=varType;,BEGIN -开始程序体,IF MyCur%ISOPEN=FALSE Then,OPEN MyCur(1);,END IF;,FETCH MyCur INTO varId,varName;-读取当前游标位置的数据,WHILE MyCur%FOUND-如果当前游标有效,则执行循环,LOOP,dbms_output.put_line(用户编号:|varId|,用户名:|varName);-显示读取的数据,FETCH MyCur INTO varId,varName;-读取当前游标位置的数据,END LOOP;,CLOSE MyCur;-关闭游标,END;-结束程序体,游标属性,(3)%ROWCOUNT属性,【例】只读取前2行记录:,/*打开显示模式*/,SET ServerOutput ON;,DECLARE -开始声明部分,varName VARCHAR2(50);-声明变量,用来保存游标中的用户名,varId NUMBER;-声明变量,用来保存游标中的用户编号,-定义游标,varType为参数,指定用户类型编号,CURSOR MyCur(varType NUMBER)IS,SELECT UserId,UserName FROM Users,WHERE UserType=varType;,游标属性,BEGIN -开始程序体,IF MyCur%ISOPEN=FALSE Then,OPEN MyCur(1);,END IF;,FETCH MyCur INTO varId,varName;-读取当前游标位置的数据,WHILE MyCur%FOUND-如果当前游标有效,则执行循环,LOOP,dbms_output.put_line(用户编号:|varId|,用户名:|varName);-显示读取的数据,IF MyCur%ROWCOUNT=2 THEN,EXIT;,END IF;,FETCH MyCur INTO varId,varName;-读取当前游标位置的数据,END LOOP;,CLOSE MyCur;-关闭游标,END;-结束程序体,游标FOR循环,【例】声明记录类型User_Record_Type和定义记录变量var_UserRecord:,TYPE User_Record_Type IS RECORD,(UserId Users.UserId%Type,UserName Users.UserName%Type);,var_UserRecord User_Record_Type;,游标FOR循环,【例】PL/SQL记录可以与游标结合使用:,/*打开显示模式*/,SET ServerOutput ON;,DECLARE -开始声明部分,/*声明记录类型*/,TYPE User_Record_Type IS RECORD,(UserId Users.UserId%Type,UserName Users.UserName%Type);,/*定义记录变量*/,var_UserRecord User_Record_Type;,-定义游标,varType为参数,指定用户类型编号,CURSOR MyCur(varType NUMBER)IS,SELECT UserId,UserName FROM Users,WHERE UserType=varType;,游标FOR循环,BEGIN -开始程序体,IF MyCur%ISOPEN=FALSE Then,OPEN MyCur(1);,END IF;,LOOP,FETCH MyCur INTO var_UserRecord;-读取当前游标位置的数据到记录变量var_UserRecord,EXIT WHEN MyCur%NOTFOUND;-当游标指向结果集结尾时退出循环,/*显示保存在记录变量var_UserRecord中的数据*/,dbms_output.put_line(用户编号:|var_UserRecord.UserId|,用户名:|var_UserRecord.UserName);,END LOOP;,CLOSE MyCur;-关闭游标,END;-结束程序体,游标FOR循环,【例】典型游标FOR循环的例子:,/*打开显示模式*/,SET ServerOutput ON;,DECLARE,CURSOR MyCur(varType NUMBER)IS,SELECT UserId,UserName FROM Users,WHERE UserType=varType;,BEGIN -开始程序体,FOR var_UserRecord IN MyCur(1)LOOP,/*显示保存在记录变量var_UserRecord中的数据*/,dbms_output.put_line(用户编号:|var_UserRecord.UserId|,用户名:|var_UserRecord.UserName);,END LOOP;,END;-结束程序体,10.2存储过程管理,过程,一种基本的存储过程,由过程名、参数和程序体组成。,函数,与过程类似,只是函数有返回值。,程序包,一组相关的PL/SQL过程和函数,由包名、说明部分和包体组成。,FUNCTION,PROCEDURE,和,PACKAGE,区别,function 和procedure是PL/SQL代码的集合,通常为了完成一个任务。procedure 不需要返回任何值而
展开阅读全文