




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Oracle12c数据库基础教程(第3版)授课教师:职务:第10章游标,存储过程与触发器学前提示本章将介绍Oracle数据库程序设计中经常会用到地3个概念,即游标,存储过程与触发器。知识要点10.1游10.2存储过程10.3触标发器10.1游标10.3.1触发器地基本概念10.3.2创建触发器10.1.3游标属性10.1.4游标FOR循环10.1.5引用游标10.1.6管理游标结果集10.1.1游标地基本概念Oracle游标可以分为两种类型,显式游标与隐式游标使用显式游标需求以下4个步骤(1)声明游标。定义游标名和游标中使用地SELECT语句。(2)打开游标。执行声明游标时定义地SELECT语句,把查询结果装入内存,游标位于结果集地第1条记录位置。(3)读取数据。从结果集地游标当前位置处读取数据,执行完成后游标后移一行。(4)关闭游标。释放结果集与游标占用地内存空间。【例10.1】使用SELECT语句声明隐式游标,从C##HRSYS.Departments表中读取Dep_name字段地值到变量DepName,代码如下:SETServerOutputON;DECLAREDepNameC##HRSYS.Departments.Dep_Name%Type;BEGINSELECTDep_nameINTODepNameFROMC##HRSYS.DepartmentsWHEREDep_ID=1;dbms_output.put_line(DepName);END;/运行结果为:人事部PL/SQL过程已成功完成。10.1.2游标控制语句1.声明游标语句CURSOR2.打开游标语句OPEN3.游标取值语句FETCH4.关闭游标语句CLOSE1.声明游标语句CURSOR声明一个游标MyCur,读取指定部门地员工信息,代码如下:DECLARECURSORMyCur(varDepidNUMBER)ISSELECTEmp_Id,Emp_NameFROMC##HRSYS.EmployeesWHEREDep_id=varDepid;1.声明常量OPEN游标名[(参数列表)];【例10.3】户信息,代码如下:打开游标MyCur,读取类型为1地用OPENMyCur(1);3.游标取值语句FETCH
游标取值语句FETCH地基本语法结构如下:FETCH游标名INTO变量列表;【例10.4】在打开地游标MyCur地当前位置读取数据,代码如下:FETCHMyCurINTOvarId,varName;显式游标必须事先打开,才能使用FETCH语句取值,否则会出现错误。4.关闭游标语句CLOSE关闭游标语句CLOSE地基本语法结构如下:CLOSE游标名;【例10.5】关闭游标MyCur,代码如下:CLOSEMyCur;显式游标使用完后,应该和时关闭,从而释放存储空间。【例10.6】下面介绍一个完整地游标应用实例/*打开显示模式*/SETServerOutputON;DECLARE--开始声明部分varIdNUMBER;--声明变量,用来保存游标中地用户编号varNameVARCHAR2(50);--声明变量,用来保存游标中地用户名--定义游标,varDepid为参数,指定员工部门编号CURSORMyCur(varDepidNUMBER)ISSELECTEmp_Id,Emp_NameFROMC##HRSYS.EmployeesWHEREDep_id=varDepid;BEGIN--开始程序体OPENMyCur(1);--打开游标,参数为1,表示读取部门编号为1地记录FETCHMyCurINTOvarId,varName;--读取当前游标位置地数据CLOSEMyCur;--关闭游标dbms_output.put_line('员工编号:'||varId||',姓名:'||varName);--显示读取地数据END;--结束程序体/运行结果为员工编号:1,姓名:张老三PL/SQL过程已成功完成。10.1.3游标属性1.2.3.%ISOPEN属性%FOUND属性与%NOTFOUND属性%ROWCOUNT属性1.%ISOPEN属性%ISOPEN属性判断游标是否被打开,如果游标被打开,则%ISOPEN于TRUE,否则%ISOPEN于FALSE。【例10.7】下面地代码演示当使用未打开地游标时,将会出现错误。/*打开显示模式*/SETServerOutputON;DECLARE--开始声明部分varNameVARCHAR2(50);--声明变量,用来保存游标中地用户名varIdNUMBER;--声明变量,用来保存游标中地用户编号3.分支语句CASE--定义游标,varDepid为参数,指定部门编号CURSORMyCur(varDepidNUMBER)ISSELECTEmp_Id,Emp_NameFROMC##HRSYS.EmployeesWHEREDep_id=varDepid;BEGIN--开始程序体FETCHMyCurINTOvarId,varName;--读取当前游标位置地数据CLOSEMyCur;--关闭游标dbms_output.put_line('员工编号:'||varId||',姓名:'||varName);--显示读取地数据END;--结束程序体/运行结果为:ORA-01001:无效地游标ORA-06512:在line9【例10.8】修改上面地程序,在使用游标之前,调用%ISOPEN属性判断游标是否打开。/*打开显示模式*/SETServerOutputON;DECLARE--开始声明部分varNameVARCHAR2(50);--声明变量,用来保存游标中地用户名varIdNUMBER;--声明变量,用来保存游标中地用户编号--定义游标,varDepid为参数,指定部门编号CURSORMyCur(varDepidNUMBER)ISSELECTEmp_Id,Emp_NameFROMC##HRSYS.EmployeesWHEREDep_id=varDepid;BEGIN--开始程序体IFMyCur%ISOPEN=FALSEThenOPENMyCur(2);ENDIF;FETCHMyCurINTOvarId,varName;--读取当前游标位置地数据CLOSEMyCur;--关闭游标dbms_output.put_line('用户编号:'||varId||',用户名:'||varName);--显示读取地数据END;--结束程序体2.%FOUND属性与%NOTFOUND属性%FOUND属性判断游标所在地行是否有效,如果有效,则%FOUND于TRUE,否则%FOUND于FALSE。【例10.9】使用%FOUND属性可以循环执行游标读取数据,请看下面地程序。/*打开显示模式*/SETServerOutputON;DECLARE--开始声明部分varNameVARCHAR2(50);--声明变量,用来保存游标中地用户名varIdNUMBER;--声明变量,用来保存游标中地用户编号--定义游标,varDepid为参数,指定部门编号CURSORMyCur(varDepidNUMBER)ISSELECTEmp_Id,Emp_NameFROMC##HRSYS.EmployeesWHEREDep_id=varDepid;BEGIN--开始程序体IFMyCur%ISOPEN=FALSEThenOPENMyCur(1);--读取部门编号为1地员工记录ENDIF;FETCHMyCurINTOvarId,varName;--读取当前游标位置地数据WHILEMyCur%FOUND--如果当前游标有效,则执行循环LOOPdbms_output.put_line('员工编号:'||varId||',姓名:'||varName);--显示读取地数据FETCHMyCurINTOvarId,varName;--读取当前游标位置地数据ENDLOOP;CLOSEMyCur;--关闭游标END;--结束程序体运行结果员工编号:1,姓名:张老三员工编号:2,姓名:李四员工编号:3,姓名:王五3.%ROWCOUNT属性【例10.10】代码如下。/*打开显示模式*/SETServerOutputON;DECLARE--开始声明部分在例10.6程序中,只读取前2行记录,程序varNameVARCHAR2(50);--声明变量,用来保存游标中地用户名varIdNUMBER;--声明变量,用来保存游标中地用户编号--定义游标,varDepid为参数,指定部门编号CURSORMyCur(varDepidNUMBER)ISSELECTEmp_Id,Emp_NameFROMC##HRSYS.EmployeesWHEREDep_id=varDepid;BEGIN--开始程序体IFMyCur%ISOPEN=FALSEThenOPENMyCur(1);ENDIF;FETCHMyCurINTOvarId,varName;--读取当前游标位置地数据WHILEMyCur%FOUND--如果当前游标有效,则执行循环LOOPdbms_output.put_line('员工编号:'||varId||',姓名:'||varName);--显示读取地数据IFMyCur%ROWCOUNT=2THENEXIT;ENDIF;FETCHMyCurINTOvarId,varName;--读取当前游标位置地数据ENDLOOP;CLOSEMyCur;--关闭游标END;--结束程序体/运行结果员工编号:1,姓名:张老三员工编号:2,姓名:李四PL/SQL过程已成功完成。10.1.4游标FOR循环TYPE记录类型名ISRECORD(字段声明[,字段声明]…);定义记录变量地方法与定义普通变量地方法相同记录变量名记录变量类型【例10.11】录变量var_UserRecord,代码如下:声明记录类型User_Record_Type与定义记TYPEUser_Record_TypeISRECORD(UserIdUsers.UserId%Type,UserNameUsers.UserName%Type);var_UserRecordUser_Record_Type;可以使用下面地方法访问记录中地字段记录名.字段名例如var_UserRecord.UserId与var_UserRecord.UserName。如果要声明地记录类型与某个表或视图地结构完全相同,则可以直接使用%ROWTYPE属性来定义记录变量,语法如下:变量名表名.%ROWTYPE;【例10.12】定义一个与表User结构完全相同地记录变量var_UserRecord1,代码如下:var_UserRecord1User%ROWTYPE;使用这种方法定义记录变量,不需求声明记录类型。记录变量地字段名与对应表或视图中地列名一致,而且拥有相同地数据类型。【例10.13】/*打开显示模式*/SETServerOutputON;DECLARE--开始声明部分/*声明记录类型*/TYPEEmployees_Record_TypeISRECORD(EmpIdC##HRSYS.Employees.Emp_Id%Type,EmpNameC##HRSYS.Employees.Emp_Name%Type);/*定义记录变量*/var_EmpRecordEmployees_Record_Type;--定义游标,varDepid为参数,指定部门编号CURSORMyCur(varDepidNUMBER)ISSELECTEmp_Id,Emp_NameFROMC##HRSYS.EmployeesWHEREDep_id=varDepid;BEGIN--开始程序体IFMyCur%ISOPEN=FALSEThenOPENMyCur(1);ENDIF;LOOPFETCHMyCurINTOvar_EmpRecord;--读取当前游标位置地数据到记录变量var_EmpRecordEXITWHENMyCur%NOTFOUND;--当游标指向结果集结尾时退出循环/*显示保存在记录变量var_EmpRecord中地数据*/dbms_output.put_line('员工编号:'||var_EmpRecord.EmpId||',用户名::'||var_EmpRecord.EmpName);ENDLOOP;CLOSEMyCur;--关闭游标END;--结束程序体/运行结果员工编号:1,用户名::张老三员工编号:2,用户名::李四员工编号:3,用户名::王五PL/SQL过程已成功完成。典型游标FOR循环地语法FOR<记录名>IN<游标名>LOOP语句1;语句2;…语句n;ENDLOOP;【例10.14】下面是一个典型游标FOR循环地例子/*打开显示模式*/SETServerOutputON;DECLARECURSORMyCur(varDepidNUMBER)ISSELECTEmp_Id,Emp_NameFROMC##HRSYS.EmployeesWHEREDep_id=varDepid;BEGIN--开始程序体FORvar_EmpRecordINMyCur(1)LOOP/*显示保存在记录变量var_EmpRecord中地数据*/dbms_output.put_line('员工编号:'||var_EmpRecord.Emp_Id||',用户名::'||var_EmpRecord.Emp_Name);ENDLOOP;END;--结束程序体/运行结果员工编号:2,用户名::李四员工编号:3,用户名::王五PL/SQL过程已成功完成。带子查询地游标FOR循环地语法FOR<记录名>IN<SELECT子查询>LOOP语句1;语句2;…语句n;ENDLOOP;【例10.15】/*打开显示模式*/SETServerOutputON;BEGIN--开始程序体FORvar_EmpRecordIN(SELECTEmp_Id,Emp_NameFROMC##HRSYS.EmployeesWHEREDep_id=1)LOOP/*显示保存在记录变量var_EmpRecord中地数据*/dbms_output.put_line('部门编号:'||var_EmpRecord.Emp_Id||',姓名::'||var_EmpRecord.Emp_Name);ENDLOOP;END;--结束程序体10.1.5引用游标引用游标(REF游标)是一种动态游标,它比普通地静态游标更加灵活,因为它不依赖指定地查询语句。换言之,引用游标在运行时可以与不同地查询语句相关联,也可以使用游标变量。引用游标有两种类型,即强型游标与弱型游标。强型游标返回指定格式地结果集,而弱型游标则没有返回类型。提示除非有特殊地需求,建议在声明引用游标时指定返回类型,因为这样减小出现错误地概率。使用引用游标地基本方法DECLARETYPEcursor_typeISREFCURSORRETURNreturn_type;cursor_variablecursor_type;single_recordreturn_type;OPENcursor_variableFORSELECT语句;LOOPFETCHcursor_variable;EXITWHENcursor_variable%NOTFOUND;...;--处理得到地行……ENDLOOP;CLOSEcursor_variable;具体说明如下
cursor_type指定引用游标地名称。return_type指定返回结果地类型。cursor_variable是定义地引用游标变量,single_record是返回结果变量。
使用OPEN语句打开并查询游标变量。使用FETCH语句获取游标中地数据。使用%NOTFOUND属性判断游标中结果集地当前行是否有效。
使用CLOSE语句关闭游标。【例10.16】下面是一个弱型游标地实例SETServerOutputON;DECLARETYPERefCurISREFCURSOR;--声明引用游标类型游标返回地类型没有限制EmpCurRefCur;--定义游标变量EmpRowC##HRSYS.Employees%ROWTYPE;--存储游标查询得到地员工结果集DepRowC##HRSYS.Departments%ROWTYPE;--存储游标查询得到地部门结果集flagint:=2;--根据flag变量值地不同,与引用游标相关联地SQL语句也不同BEGINIFflag=0THENOPENEmpCurFORSELECT*FROMC##HRSYS.EmployeesWHEREWage<3000;ELSIFflag=1THENOPENEmpCurFORSELECT*FROMC##HRSYS.EmployeesWHEREWage>=3000;ELSIFflag=2THEN--因为弱类型游标对目标表没有限制,数据可以使来自任何表,所以这里绑定到表DepartmentsOPENEmpCurFORSELECT*FROMC##HRSYS.Departments;ELSEOPENEmpCurFORSELECT*FROMC##HRSYS.Employees;ENDIF;LOOPIFflag=2THENFETCHEmpCurINTODepRow;EXITWHENEmpCur%NOTFOUND;--如果没有查询到数据就退出DBMS_output.put_line('Dep_name='||DepRow.Dep_name);ELSEFETCHEmpCurINTOEmpRow;EXITWHENEmpCur%NOTFOUND;--如果没有查询到数据就退出DBMS_output.put_line('name='||EmpRow.Emp_name||'Wage='||EmpRow.Wage);ENDIF;ENDLOOP;CLOSEEmpCur;END;/将flag设置为0时地运行结果将flag设置为1时地运行结果将flag设置为2时地运行结果【例10.17】SETServerOutputON;DECLARE--声明引用游标类型,只能返回C##HRSYS.Employees类型地记录TYPERefEmpCurISREFCURSORRETURNC##HRSYS.Employees%ROWTYPE;EmpCurRefEmpCur;--定义游标变量EmpRowC##HRSYS.Employees%ROWTYPE;--存储游标查询得到地员工结果集flagint:=0;--根据flag变量值地不同,与引用游标相关联地SQL语句也不同BEGINIFflag=0THENOPENEmpCurFORSELECT*FROMC##HRSYS.EmployeesWHEREWage<3000;ELSIFflag=1THENOPENEmpCurFORSELECT*FROMC##HRSYS.EmployeesWHEREWage>=3000;ELSEOPENEmpCurFORSELECT*FROMC##HRSYS.Employees;ENDIF;LOOPFETCHEmpCurINTOEmpRow;EXITWHENEmpCur%NOTFOUND;--如果没有查询到数据就退出DBMS_output.put_line('name='||EmpRow.Emp_name||'Wage='||EmpRow.Wage);ENDLOOP;CLOSEEmpCur;END;10.1.6管理游标结果集1.修改游标结果集中地行2.删除游标结果集中地行1.修改游标结果集中地行DECLARECURSOR游标名[(参数列表)]ISSELECT语句FORUPDATEOF可以更新地列名;【例10.18】下面定义了一个游标MyEmpCursor,可以访问指定部门中地员工记录,并可以更新员工工资列DECLARECURSORMyEmpCursor(varEmpIdNUMBER)ISSELECTEmp_name,WageFROMC##HRSYS.EmployeesWHEREDep_id=varDepIdFORUPDATEOFWage;/使用WHERECURRENTOF子句指定要更新地游标UPDATE表名SET子句WHERECURRENTOF游标名【例10.19】DECLARECURSORMyEmpCursor(varDepIdNUMBER)ISSELECTEmp_name,WageFROMC##HRSYS.EmployeesWHEREDep_id=varDepIdFORUPDATEOFWage;BEGINFORrec1INMyEmpCursor(1)LOOPUPDATEC##HRSYS.EmployeesSETWage=Wage+100WHERECURRENTOFMyEmpCursor;ENDLOOP;END;/脚本地运行过程如下:(1)首先使用DECLARECURSOR语句声明一个游标MyEmpCursor,查询表C##HRSYS.Employees中部门编号于参数varDepId地员工记录。(2)使用FOR…LOOP语句遍历表MyEmpCursor(1)中地所有记录。(3)在UPDATE语句中使用WHERECURRENTOF子句,修改当前游标中地记录。执行上面地脚本后,查询表Employees中地数据,确认部门编号为1地员工工资增加了100。2.删除游标结果集中地行DELETEFROM表名WHERECURRENTOF游标名【例10.20】下面地脚本中可以删除所有部门编号为1地员工记录。DECLARECURSORMyEmpCursor(varDepIdNUMBER)ISSELECTEmp_name,WageFROMC##HRSYS.EmployeesWHEREDep_id=varDepIdFORUPDATEOFWage;BEGINFORrec1INMyEmpCursor(1)LOOPDELETEFROMC##HRSYS.EmployeesWHERECURRENTOFMyEmpCursor;ENDLOOP;END;/10.2存储过程PL/SQL有以下3种存储过程。
过程:一种基本地存储过程,由过程名,参数与程序体组成。
函数:与过程类似,只是函数有返回值。
程序包:一组相关地PL/SQL过程与函数,由包名,说明部分与包体组成。10.2.1过程CREATE[ORREPLACE]PROCEDURE过程名[参数列表]IS|AS[局部变量声明]BEGIN<过程体>END[过程名];以下几点需求特别说明
使用REPLACE关键字表示如果要创建地过程已经存在,则将其替换为当前定义地过程。
参数名[IN|OUT|INOUT]数据类型[:=参数声明地格式如下:初始值]IN参数类型表示此参数接受过程外传递来地值;OUT参数类型表示此参数将在过程中被赋值,并传递到过程体外;INOUT参数类型表示此参数同时具备IN与OUT参数型地特性。
在局部变量声明块中定义地变量只在过程体内有效。【例10.21】CREATEORREPLACEPROCEDUREC##HRSYS.ResetWage(v_EmpIdINNUMBER)ASBEGINUPDATEC##HRSYS.EmployeesSETWage=8000WHEREEmp_id=v_EmpId;END;/要将编号为2(员工李四)地用户工资重置,可以使用如下代码EXECUTEC##HRSYS.ResetWage(2);SELECTEmp_name,WageFROMC##HRSYS.EmployeesWHEREEmp_Id=2;运行结果为:EMP_NAME-----------------李四WAGE-------------------使用DROPPROCEDURE命令删除过程DROPPROCEDURE[方案名.]过程名【例10.22】ResetWage。使用下面地语句可以删除示例过程DROPPROCEDUREC##HRSYS.ResetWage;10.2.2函数CREATE[ORREPLACE]FUNCTION函数名[参数列表][RETURN函数数据类型]IS|AS[局部变量声明]BEGIN过程体RETURN函数值END[过程名];以下两点需求特别说明
RETURN函数数据类型子句指定了函数返回值地数据类型。
RETURN函数值子句将函数值作为函数地结果返回。【例10.23】CREATEFUNCTIONC##HRSYS.GetWage(v_nameINEmployees.Emp_Name%Type)RETURNEmployees.Wage%TypeASoutwageEmployees.Wage%Type;BEGINSELECTWageINTOoutwageFROMEmployeesWHEREEmp_name=''||v_name||'';RETURNoutwage;END;/调用函数SETServerOutputON;DECLAREvarWageC##HRSYS.Employees.Wage%Type;BEGINvarWage:=C##HRSYS.GetWage('李四');dbms_output.put_line(varWage);END;/【例10.24】删除函数C##HRSYS.GetWage地语句如下:DROPFUNCTIONC##HRSYS.GetWage;10.2.3程序包CREATE[ORREPLACE]PACKAGE程序包名IS|AS[声明部分]END[程序包名];【例10.25】下面介绍一个示例创建程序包C##HRSYS.MyPack,它包含前面小节中地过程ResetWage与函数GetWage。代码如下:CREATEORREPLACEPACKAGEC##HRSYS.MyPackISPROCEDUREResetWage(v_EmpIdINNUMBER);FUNCTIONGetWage(v_nameINEmployees.Emp_Name%Type)RETURNEmployees.Wage%Type;ENDMyPack;/使用CREATEPACKAGEBODY语句来创建包体部分CREATEPACKAGEBODY程序包名IS|AS[声明部分][过程体][函数体][初始化部分]END[程序包名];【例10.26】下面创建程序包MyPack地包体部分CREATEPACKAGEBODYC##HRSYS.MyPackISPROCEDUREResetWage(v_EmpIdINNUMBER)ASBEGINUPDATEC##HRSYS.EmployeesSETWage=8000WHEREEmp_id=v_EmpId;END;FUNCTIONGetWage(v_nameINEmployees.Emp_Name%Type)RETURNEmployees.Wage%TypeASoutwageEmployees.Wage%Type;BEGINSELECTWageINTOoutwageFROMEmployeesWHEREEmp_name=''||v_name||'';RETURNoutwage;END;ENDMyPack;/可以使用下面地方法调用程序包中地过程。方案名.程序包名.过程名可以使用下面地方法调用程序包中地函数。方案名.程序包名.函数名【例10.27】SETServerOutputON;DECLAREvarWageC##HRSYS.Employees.Wage%Type;BEGINvarWage:=C##HRSYS.MyPack.GetWage('李四');dbms_output.put_line(varWage);【例10.28】删除程序包体C##HRSYS.MyPack地语句如下:DROPPACKAGEBODYC##HRSYS.MyPack;使用DROPPACKAGE命令删除程序包地说明部分【例10.29】删除程序包C##HRSYS.MyPack地语句如下:DROPPACKAGEC##HRSYS.MyPack;10.3触发器触发器是一种特殊地存储过程,当指定地事件发生时自动运行。10.3.1触发器地基本概念根据以下3个因素区分不同地触发器1.触发事件2.触发时间3.触发级别1.触发事件
DML语句事件:执行INSERT,UPDATE,DELETE语句时触发地事件。
DDL语句事件:执行CREATE,ALTER,DROP语句语句时触发地事件。
数据库事件:执行STARTUP,SHUTDOWN,LOGON,LOGOFF操作时触发地事件。
系统错误:当Oracle数据库系统出现错误时触发地事件。2.触发时间
BEFORE:在指定地事件发生之前执行触发器。
AFTER:在指定地事件发生之后执行触发器。3.触发级别
行触发:对触发事件影响地每一行(例如,一条语句更新或删除多条记录)都执行触发器。
语句触发:对于触发事件只能执行触发器一次。10.3.2创建触发器1.创建语句触发器2.创建行触发器3.创建INSTEADOF触发器4.创建LOGON与LOGOFF触发器1.创建语句触发器CREATE[ORREPLACE]TRIGGER触发器名[BEFORE|AFTER]触发事件ON表名|视图名PL/SQL程序体以下几点需求特别说明
触发事件可以是INSERT,UPDATE与DELETE。表名|视图名定义了与触发器相关地表或视图地名字。
PL/SQL程序体是触发器触发时要执行地程序块。【例10.30】CREATETABLEC##HRSYS.Test(idnameINTEGER,VARCHAR2(50));CREATETABLEC##HRSYS.LogTable(log_dateactionDATE,VARCHAR2(50));创建语句触发器LogUpdateTriggerCREATEORREPLACETRIGGERC##HRSYS.LogUpdateTriggerAFTERINSERTORUPDATEORDELETEONC##HRSYS.TestDECLARElog_actionVARCHAR2(50);BEGINIFINSERTINGTHENlog_action:='Insert';ELSIFUPDATINGTHENlog_action:='Update';ELSIFDELETINGTHENlog_action:='Delete';ELSEDBMS_OUTPUT.PUT_LINE('..');ENDIF;INSERTINTOC##HRSYS.LogTable(log_date,action)VALUES(SYSDATE,log_action);END;/在表Test上执行INSERT,UPDATE与DELETE操作INSERTINTOC##HRSYS.TestVALUES(1,'Insert');UPDATEHRSYS.TestSETname='Update';DELETEFROMC##HRSYS.TestWHEREid=1;COMMIT;查看表LogTable地内容2.创建行触发器CREATE[ORREPLACE]TRIGGER触发器名[BEFORE|AFTER]触发事件ON表名|视图名FOREACHROW<PL/SQL程序体>【例10.31】CREATEORREPLACETRIGGERC##HRSYS.MyTriggerAFTERUPDATEONC##HRSYS.DepartmentsFOREACHROWBEGINUPDATEC##HRSYS.EmployeesSETDep_Id=:new.Dep_IdWHEREDep_Id=:old.Dep_Id;END;/为了验证触发器地功能,可以在SQLPlus中运行以下命令:UPDATEC##HRSYS.DepartmentsSETDep_Id=101WHEREDep_Id=1;COMMIT;3.创建INSTEADOF触发器CREATE[ORREPLACE]TRIGGER触发器名INSTEADOF触发事件ON表名|视图名PL/SQL程序体【例10.32】CREATEVIEWC##HRSYS.V_EMP_DEPTASSELECTC##HRSYS.EMPLOYEES.Emp_id,C##HRSYS.EMPLOYEES.Emp_name,C##HRSYS.EMPLOYEES.Sex,C##HRSYS.EMPLOYEES.Title,C##HRSYS.DEPARTMENTS.DEP_NAME,C##HRSYS.DEPARTMENTS.DEP_IDFROMC##HRSYS.EMPLOYEES,C##HRSYS.DEPARTMENTSWHEREC##HRSYS.EMPLOYEES.DEP_ID=C##HRSYS.DEPARTMENTS.DEP_ID;创建一个触发器MyInsteadofTriggerCREATEORREPLACETRIGGERC##HRSYS.MyInsteadofTriggerINSTEADOFUPDATEONC##HRSYS.V_EMP_DEPTBEGINUPDATEC##HRSYS.EmployeesSETEmp_name=:new.Emp_name,Sex=:new.Sex,Title=:new.TitleWHEREEmp_id=:old.Emp_id;END;/创建触发器MyInsteadofTrigger后,验证它地功能UPDATEC##HRSYS.V_EMP_DEPTSETEmp_name='李红',Title='经理',Se
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024计算机基础考试知识扩展试题及答案
- 2024年美容师固定客户群体管理策略的优化分析试题及答案
- 合规经理面试题及答案
- 小学六年级语文全覆盖试题及答案
- 小学一年级语文试题蓝图与答案
- 药理学复习的信息获取途径及试题答案
- 做人的准则面试题及答案
- 2024年汽车维修工考试核心知识题目及答案
- 互联网对二手车评估的影响研究试题及答案
- 2024年行政管理考试知识回顾试题及答案
- 【9物一模】安徽合肥瑶海区2025年中考物理一模试卷
- 双休日超车好时机!课件-2024-2025学年高中下学期学习哲思主题班会
- 建筑工程隔声、节能和LEED认证配合管理方案
- 办公室文员招聘启事范文模板
- 学风建设主题班会(大学班会)
- 干洗店服务合同
- IDC机柜租赁服务合同
- 急性心房颤动中国急诊管理指南(2024)解读
- 知识产权合规管理体系解读
- 护理不良事件之管路脱出
- 区域医学检测中心的建设与管理V3
评论
0/150
提交评论