课程名称Oracle数据库系统设计实验序号05实验项目过程、函数和触发器实验地点综B504实验学时2实验类型指导教师侯睿实验员专业____软件工程_____班级2班学号姓名2014年6月9日一、实验目的及要求通过上机实践熟悉Oracle11g的对象管理,创建过程、函数和触发器,并进行测试。二、实验原理与内容(1)创建一个过程avg_sal,用于输出emp表中的某个部门的平均工资,并在PL/SQL匿名块调用该过程输出部门SALES的平均工资;(2)创建一个函数find_loc,用于返回某个员工所在的工作地点。并调用该函数,显示员工号为7788的工作地点。(3)创建一个触发器tr_emp_sal,当进行update操作时,员工的工资只能涨不能降,不允许删除员工记录,并修改sal和删除记录,查看相关信息。三、实验软硬件环境1、多媒体计算机一台;2、计算机上安装有Oracle11g数据库软件;四、实验过程(实验步骤、记录、数据、分析)1、打开进程,并以数据库管理员身份登陆:(1)点击“开始”-“运行”,输入lsnrctlstart以启动监听程序服务,如下:C:\DocumentsandSettings\LinuxlsnrctlstartLSNRCTLfor32-bitWindows:Version11.1.0.6.0-Productionon09-6月-201410:23:17Copyright(c)1991,2007,Oracle.Allrightsreserved.启动tnslsnr:请稍候...TNSLSNRfor32-bitWindows:Version11.1.0.6.0-Production系统参数文件为d:\app\Linux\product\11.1.0\db_1\network\admin\listener.ora写入d:\app\linux\diag\tnslsnr\Linux-49\listener\alert\log.xml的日志信息监听:(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1521ipc)))监听:(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=Linux-49)(PORT=1521)))正在连接到(DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))LISTENER的STATUS------------------------别名LISTENER版本TNSLSNRfor32-bitWindows:Version11.1.0.6.0-Production启动日期09-6月-201410:23:19正常运行时间0天0小时0分2秒跟踪级别off安全性ON:LocalOSAuthenticationSNMPOFF监听程序参数文件d:\app\Linux\product\11.1.0\db_1\network\admin\listener.ora监听程序日志文件d:\app\linux\diag\tnslsnr\Linux-49\listener\alert\log.xml监听端点概要...(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1521ipc)))(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=Linux-49)(PORT=1521)))监听程序不支持服务命令执行成功(2)输入netstartoracleserviceorcl以启动实例服务:C:\DocumentsandSettings\LinuxnetstartoracleserviceorclOracleServiceORCL服务正在启动.................OracleServiceORCL服务已经启动成功。(3)通过命令行连接到SQL*Plus:C:\DocumentsandSettings\Linuxsqlplussystem/systemassysdbaSQL*Plus:Release11.1.0.6.0-Productionon星期一6月910:39:032014Copyright(c)1982,2007,Oracle.Allrightsreserved.连接到:OracleDatabase11gEnterpriseEditionRelease11.1.0.6.0-ProductionWiththePartitioning,OLAP,DataMiningandRealApplicationTestingoptionsSQL2、创建一个过程avg_sal,用于输出emp表中的某个部门的平均工资,并在PL/SQL匿名块调用该过程输出部门SALES的平均工资。SQLedit已写入fileafiedt.buf1CREATEORREPLACEPROCEDUREavg_sal2(emp_nameINVARCHAR2,valueOUTNUMBER)AS3BEGIN4selectavg(sal)INTOvaluefromscott.emp5wheredeptno=6(selectdeptnofromscott.dept7wheredname=emp_name);8*ENDavg_sal;SQL/过程已创建。SQLvariablevalueNUMBERSQLexecavg_sal('SALES',:value);PL/SQL过程已成功完成。SQLPRINTvalue;VALUE----------1566.666673、创建一个函数find_loc,用于返回某个员工所在的工作地点。并调用该函数,显示员工号为7788的工作地点。SQLedit已写入fileafiedt.buf1CREATEORREPLACEFUNCTIONfind_loc(emp_numNUMBER)2RETURNVARCHAR2AS3loc_namescott.dept.loc%TYPE;4BEGIN5selectlocINTOloc_namefromscott.dept6wheredeptno=7(selectdeptnofromscott.emp8whereempno=emp_num);9RETURNloc_name;10*ENDfind_loc;SQL/函数已创建。SQLselectfind_loc(7788)fromdual;FIND_LOC(7788)--------------------------------------------------------------------------------DALLASSQL4、创建一个触发器tr_emp_sal,当进行update操作时,员工的工资只能涨不能降,不允许删除员工记录,并修改sal和删除记录,查看相关信息。SQLcreateorreplacetriggertr_emp_salbeforeupdateofsalordeleteonempforeachrowbegincasewhenupdating('sal')thenif:new.sal-:old.sal0thenraise_application_error(-20001,'员工的工资只能涨不能降!');endif;whendeletingthenraise_application_error(-20001,'不能删除员工记录!');endcase;end;触发器已创建SQLdeletefromscott.empwhereempno=79342/deletefromscott.empwhereempno=7934*第1行出现错误:ORA-20001:不能删除员工记录!ORA-06512:在SYS.TR_EMP_SAL,line8ORA-04088:触发器'SYS.TR_EMP_SAL'执行过程中出错SQLupdatescott.empsetsal=100whereempno=79342/updatescott.empsetsal=100whereempno=7934*第1行出现错误:ORA-20001:员工的工资只能涨不能降!ORA-06512:在SYS.TR_EMP_SAL,line5ORA-04088:触发器'SYS.TR_EMP_SAL'执行过程中出错SQLupdatescott.empsetsal=10000whereempno=79342/已更新1行。SQL五、测试/调试及实验结果分析1、遇到的问题:(1)当输入lsnrctlstart以启动进程监听时,显示以下信息:C:\Users\AdministratorlsnrctlstartLSNRCTLfor32-bitWindows:Version11.1.0.6.0-Productionon20-3月-201217:25:05Copyright(c)1991,2007,Oracle.Allrightsreserved.启动tnslsnr:请稍候...TNSLSNRfor32-bitWindows:Version11.1.0.6.0-Production系统参数文件为D:\app\Administrator\product\11.1.0\db_1\network\admin\listener.ora写入d:\app\administrator\diag\tnslsnr\Chenk2007\listener\alert\log.xml的日志信息监听:(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1521ipc)))监听该对象时出错:(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=202.192.134.11)(PORT=1521)))TNS-12545:因目标主机或对象不存在,连接失败TNS-12560:TNS:协议适配器错误TNS-00515:因目标主机或对象不存在,连接失败32-bitWindowsError:49:Unknownerror监听程序未能启动。请参阅上面的错误消息...因此,打开“配置和移植工具”中的“NetManager”把“主机名”改为本机的主机名“Chenk2007”,这样即可解决本问题。六、实验结论与体会总的来说,通过本次实验,我学会了Oracle数据库过程、函数和触发器的创建、修改和使用。这些其实都是一些很重要的数据库操作知识,在接下来的学习中我会更加努力,学会Oracle数据PL/SQL语言的更多知识。2014年6月9日