Oracle数据库实验8,Oracle数据库系统应用开发实用教程文本ch8实验报告

这篇实验报告详细介绍了如何在Oracle数据库中编写和使用存储过程、函数以及触发器。内容涵盖从基本的存储过程和函数调用来到复杂的程序包、语句级和行级触发器的实现。报告通过一系列实例演示了如何创建和测试这些数据库对象,以确保其正确性和功能有效性。
摘要由CSDN通过智能技术生成

《Oracle数据库系统应用开发实用教程文本ch8实验报告》由会员分享,可在线阅读,更多相关《Oracle数据库系统应用开发实用教程文本ch8实验报告(12页珍藏版)》请在人人文库网上搜索。

1、广东科学技术职业学院计算机工程技术学院(软件学院)实验报告专业班级 成绩评定学号姓名(合作者号)教师签名实验题目 存储过程、函数、程序包和触发器第周 星期 _第_节实验目的与要求1掌握编写存储过程和调用过程的方法2掌握编写函数和调用函数的方法3.掌握程序包的编写规范4掌握执行程序包中过程和函数的方法。5掌握语句级触发器的原理。6语句级触发器的编写方法。7测试语句级触发器是否生效。8掌握行级触发器的原理。9行级触发器的编写方法。10. 测试行级触发器是否生效。11. 掌握替代触发器的原理。12. 创建DDL触发器。13. 替代触发器的测试方法。14. 掌握DDL触发器的原理。15. 创建DDL触。

2、发器。16.DDL触发器的测试方法。17. 掌握数据库级触发器的原理。18. 创建数据库级触发器。19. 数据库级触发器的测试方法。一、实验环境及方案Windows Server 2000 sp1 或更高版本;或 Windows Server 2003的所有版本;或 Windows XP专业版;Oracle10g;In ternet环境及浏览器。二、实验步骤实训8.1存储过程目的和要求掌握编写存储过程和调用过程的方法实训内容指导:编写一个存储过程,要求根据用户输入的员工号(employee_id)查询EMPLOYEES 表,返回员工的姓名、工作职位和薪水(first_name, last_na。

3、me, job_title,salary。并编写 一个匿名块调用此过程。(使用HR用户的EMPLOYEES表、JOBS表,其中关联字段为 EMPLOYEES. JOB_ID 和 JOBS. JOB_ID。以下同)(1。编写存储过程create or replace procedure pro_emp(emp_id nu mber)asvfn ame varchar2(20);vln ame varchar2(20);vjob varchar2(20);n sal nu mber;beg inselect e.first name,e.last name,j.Job title,e.salary。

4、into vfname,vlname,vjob,nsalfrom employees ejobs j where employee_id=emp_id and e.job_id=j.job_id ;dbms_output.put_line (雇员的姓名是:|vfname| |vlname);dbms_output.put_line (雇员的职位是:|vjob);dbms_output.put_line (雇员的薪水是:|nsal);excepti onwhen no _data_fo und the n dbms_output.put_line (雇员编号未找到!);end pro_emp;(。

5、2)调用执行存储过程exec pro_emp(104);执行结果为雇员的姓名是:Bruce Ernst雇员的职位是:Programmer雇员的薪水是:6000练习:1编写一个过程,要求根据用户输入的员工号(employee_id)查询EMPLOYEES表,返回员工的工作职位、工作年限、电话和Email。并编写一个匿名块调用此过程。2.创建一个过程,用来实现九九乘法表。实训8.2函数目的和要求掌握编写函数和调用函数的方法实训内容指导:编写函数以部门号为参数,并计算该部门的平均工资。(1)编写函数create or replace fun cti on fun _avgsal(dept_id nu。

6、 mber)retur n floatassal_avg float(10);beg inselect avg(salary) into sal_avg from employees where departme nt_id =dept_id; return sal_avg;EXCEPTIONwhe n NO_DATA_FOUND the nDBMS_OUTPUT.PUT_LINE(部门号未找至U !);end ;(2) 调用函数set serveroutput on;declaresal_avg float(10);beg insal_avg :=fun _avgsal(60);DBMS_O。

7、UTPUT.PUT_LINE(该部门的平均工资为:|sal_avg); end;执行结果为该部门的平均工资为:5760练习:在上面题目的基础上,列出部门内比平均工资高的员工姓名、职位和薪水。实训8.3程序包目的和要求 掌握程序包的编写规范 掌握执行程序包中过程和函数的方法。实训内容指导:编写一个程序包,此程序包有一个过程和一个函数,过程根据职员编号显示工作职 位和薪水。函数根据职员编号返回职员的就职日期。并编写调用程序执行。(1) 编写程序包规范create or replace package pack_employeeisprocedure pro_job_sal(emp_id nu mb。

8、er);fun ctio n fun _date(emp_id nu mber) return date;end pack_employee;(2) 编写程序包主体create or replace package body pack_employeeasprocedure pro_job_sal(emp_id nu mber)isvjob varchar2(20);n sal nu mber(20);begi nselect j.job_title,e.salary into vjob,n sal from employees e,jobs j where e.job_id=j.job_id。

9、 and e.employee_id=emp_id;DBMS_OUTPUT.PUT_LINE(该职员的工作为:|vjob|薪水为:|nsal); excepti on whe n NO_DATA_FOUND the nDBMS_OUTPUT.PUT_LINE(职员编号未找到!);end pro_job_sal;function fun _date(emp_id nu mber)return dateish_date date;begi nselect hire_date into h_date from employees where employee_id=emp_id; return h_。

10、date;EXCEPTIONwhe n NO DATA FOUND the nDBMS_OUTPUT.PUT_LINE(职员编号未找到!);end fun _date;end pack_employee;(3) 调用程序set serveroutput on;execute pack_employee.pro_job_sal (105);执行结果为该职员的工作为:Programmer薪水为:4800declareh_date date;beg inh_date:=pack_employee.fu n_date(105);DBMS_OUTPUT.PUT_LINE(该职员的就职日期是:|h_dat。

11、e);end;执行结果为该职员的就职日期是:25-6月-97练习:编写一个程序包,此程序包有一个过程和一个函数。过程以员工的工作职位(jobs表job_title字段)为参数,显示相同职位中的员工人数。函数利用传入参数传入部门号, 返回该部门中的员工人数。并编写调用程序执行。实训8.4语句级触发器目的和要求 掌握语句级触发器的原理。 语句级触发器的编写方法。 测试语句级触发器是否生效。实训内容 指导:创建语句级触发器,需要对scott用户的dept表上进行dml操作的用户进行安全 检查,如果不是scott用户,不能够做增、删、改的动作。(1建立触发器create or replace trig。

12、ger biud_deptbefore in sert or update or delete on deptbegi nif user not in (SCOTT) thenraise_applicati on _error(-20001, you do not have access to modify this table.); end if;end;(3)测试触发器即使sys , system用户也不能修改dept表。练习:创建语句级触发器,需要对HR用户的jobs表上进行dml操作的用户进行安全检查, 如果不是HR用户,不能够做增、删、改的动作。实训8.5行级触发器目的和要求 掌握行。

13、级触发器的原理。 行级触发器的编写方法。 测试行级触发器是否生效。实训内容练习:创建一行级触发器,为学生信息表的主键生成自增序列号。(学生信息表信息包括学号、姓名、籍贯等,其中学号的编码示例为01041107+两位序号)。步骤提示:(1)建学生信息表(2)建序列(3)建立触发器(4)插入数据(5)测试实训8.6替代触发器目的和要求 掌握替代触发器的原理。 创建DDL触发器。 替代触发器的测试方法。实训内容指导:仓U建一个视图 view_emp_dept,数据来源于 emp表的字段 empno, ename job, emp.deptno,条件是 emp.deptno=dept.deptno。然。

14、后对视图 view_emp_dept更新部门信 息。例如:对视图进行更新操作,出现错误,请用替代触发器解决。步骤:(1)授权给SCOTT用户创建视图的权限,创建视图conn system/ma nager1;grant create view to scott;conn scott/tiger;create or replace view view_emp_dept as select emp no,en amejob, emp.dept no dep no from emp,dept where emp.dept no=dept.deptn;o(2)对视图进行更新操作update view_。

15、emp_dept set dep no = 50 where dep no = 10;执行结果为update view_emp_dept set dep no = 55 where dep no = 10*第1行出现错误:ORA-O2291:违反完整约束条件(SCOTT.FK_DEPTNO)-未找到父项关键字(3)在视图上创建INSTEAD O!触发器create or replace trigger dept_emp_updin stead of updateon view emp deptfor each rowdeclarerowc nt nu mber;beg inselect cou。

16、n t(*) in to rowc nt from dept where dept no=:n ew.dep no; if rowc nt=O the nbegi ninsert into dept(deptno) values (:new.depnd新部门名称);update emp set dept no=:n ew.dep no where dept no =:old.dep no end;elseupdate emp set dept no=:n ew.dep no where dept no =:old.dep no ; end if;end;(4) 重新对视图进行插入操作updat。

17、e view_emp_dept set dep no = 50 where dep no = 10;执行结果为已更新3行。练习:60。请用替代触发器解决对视图view_emp_dept进行插入数据,其部门号为实训8.7 DDL触发器目的和要求 掌握DDL触发器的原理。 创建DDL触发器。 DDL触发器的测试方法。实训内容练习:建立DDL触发器用于审计记录所删除的对象情况。(1)建立一日志表conn scott/tiger;create table droped_objects(object_ name varchar2(30),object_type varchar2(30),dropped_。

18、 on date);(2)创建触发器(3 )进行测试提示:先创建表、视图等对象然后将这些对象删除。查看日志记录实训8.8数据库级触发器目的和要求 掌握数据库级触发器的原理。 创建数据库级触发器。 数据库级触发器的测试方法。实训内容指导:创建数据库级触发器,记录数据库发生错误的信息。SCOTT用户下创建)(1)创建下面的表来实现记录数据库发生错误的信息(例如在conn scott/tiger;create table error_log(timestamp date,user name varchar2(30),in sta nee nu mber, database_ name varchar。

19、 2(50), error stack varchar 2(2000));(2)授予创建触发器的用户 admi nister database trigge权限(注:普通用户需具有此权限才能创建系统触发器)conn system/ma nager;grant adm ini ster database trigger to scott;(3)建立数据库级触发器create or replace trigger logerrorsafter servererror on databasebeg inin sert into error_log values(sysdate,sys .login 。

20、_user, sys.i nsta nce_nu m,sys.database_ name, dbms_utility.format_error_stack);end logerrors;(4)测试数据库级触发器模拟数据库无法连接的错误,如数据库连接密码错误等。conn hr/hre;执行结果为ERROR:ORA-01017: in valid user name/password; log on deniedconn scott/tiger;执行结果为已连接。select * from error_log;执行结果为TIMESTAMP USERNAMEINSTANCE DATABASE_NA。

21、MEERROR_STACK16-10 月-071 ORA9.US.ORACLE.COMORA-01017: inv alid user name/password; logo n denied练习:创建数据库级触发器,审计跟踪用户登录和注销信息。(1) 创建存储审计信息的表create table log on audittable(eve ntvarchar2 (10),sidnu mber,timestampdate,user namevarchar2 (10),machi nen ame varchar2 (64);(2) 创建登录触发器logon trigger(3) 创建注销触发器logoff trigger(4) 以不同用户登录系统,查看logonaudittable日志信息三、实验结果四、心得体会。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值