1、大型数据库技术及应用实验报告 4实验名称: PL/SQL基础(2)专业班级: 姓名: 学号:实验日期 : 年 月 日一、 实验目的1、 掌握隐式游标的基本操作;2、 掌握游标的属性操作;3、 掌握参数化游标的使用;4、 掌握存储过程的创建及使用;5、 掌握复用重做日志文件组的方法及复用重做日志成员文件的方法;6、 掌握日志组及日志成员状态的相应视图;7、 掌握数据库归档模式的切换;二、 实验内容1、 掌握隐式游标的基本操作;2、 游标的属性操作3、参数化游标4、存储过程的创建及使用实验报告填写说明:PART A 为说明部分,不要打印到实验报告中,PART B为练习部分 ,将对应的实验截图粘贴入
2、对应位置。PART A 说明:1、掌握隐式游标的基本操作;隐式游标 -由Oracle数据库自动创建,名称是(SQL) ,主要用途是可以返回一个操作是否成功或失败. (1) 由Oracle在内部声明,由系统管理 (2) 用于处理 -DML语句 -注意只能用于DML语句哦。 -返回单行的查询-如果使用select . into ,则要求该select查询的结果只包含一条记录 (3) 用于判断一个操作是否成功. SQL%notfound -返回Boolean值 存在结果集返回 False SQL%found -返回Boolean值 存在结果集返回 True SQL%rowcount -修改涉及到的记
3、录的行数 SQL%isopen -在隐式游标里一般这个属性是自动打开和关闭的,且任何时候查询都返回False。例1、 Set serveroutput ondeclare iCount int:=0; begin insert into emp(empno,enmae) values(2,jerry); DBMS_output.put_line(游标所影响的行数:|SQL%rowcount); if SQL%NotFount then DBMS_output.put_line(NotFount为真); else DBMS_output.put_line(NofFount为假); end if;
4、2、显式游标的属性操作(1) 是否找到游标%FOUND 此属性表示当前游标是否指向有效的一行,取值:TRUE FALSE例2:BeginDelete from empWhere empno=7934;If sql%found thenDbms_output.put_line(delete success);Else Dbms_output.put_line(delete fail);End if;End;说明:该例使用了隐式游标,当然,显式游标也可以使用属性%FOUND(2)是否未找到游标%NOTFOUND上例等价于:例3:BeginDelete from empWhere empno=793
5、4;If sql%notfound thenDbms_output.put_line(delete fail);Else Dbms_output.put_line(delete success);End if;End;/(3) 游标行数%ROWCOUNT 此属性记录了用户成功提取数据的行数,也可以了解为游标所在的行数。例4:DeclareEmpl emp%rowtype;Cursor emp_cur isSelect * from emp;BeginOpen emp_cur;LoopFetch emp_cur into empl;Dbms_output.put_line(to_char(emp
6、l.empno);Exit when emp_cur%rowcount=5;End loop;Close emp_cur;End;(4) 是否打开游标%ISOPEN例5:DeclareEmpl emp%rowtype;Cursor emp_cur isSelect * from emp;BeginIf emp_cur%isopen then Fetch emp_cur into empl;Dbms_output.put_line(to_char(empl.empno);ElseDbms_output.put_line(emp_cur is not open);Open emp_cur;Loop
7、Fetch emp_cur into empl;Dbms_output.put_line(to_char(empl.empno);Exit when emp_cur%rowcount=5;End loop;Close emp_cur;End if;End;/3、参数化游标在定义游标时可以带上参数,使得在使用游标时,根据参数不同所选中的结果集也不同,达到动态使用游标的目的。例6:首先在SQL/PLUS上输入下面的语句:Accept dept_id prompt please input the deptno:说明:accept是SQL/PLUS的命令,不是pl/sql语句,类似于c语言的cin,
8、该命令可以接受你的键盘输入到dept_id。例6:DeclareDid emp.Deptno%type:=&dept_id;Empl emp%rowtype;Cursor emp_cur(deptid number)isSelect * from emp where deptno=deptid;BeginOpen emp_cur(did);LoopFetch emp_cur into empl;Dbms_output.put_line(to_char(empl.empno);Exit when (emp_cur%rowcount=3) or (emp_cur%notfound) ;End lo
9、op;Close emp_cur;End;4、存储过程的创建及使用 所谓的存储过程就是存储在数据库中的过程,该过程与数据库中的表、视图一样属于数据库对象。(1)语法Create or replace procedure (,方式1,方式2)Is|asPl/sql (2) 例例7:创建存储过程Create or replace procedure dept_member_num( in_deptno in emp.deptno%type)AsOut_num number;Begin Select count(*) into out_num From emp where deptno=in_dep
10、tno;Dbms_output.put_line(the number of dept|to_char(in_deptno)| is |to_char(out_num) ;End dept_member_num;调用存储过程:分别执行Execute dept_member_num(10);Execute dept_member_num(20);Execute dept_member_num(30);PART B 练习:1、 将工资小于1000的员工的工资更新为原始工资的1.2倍,并将影响到的行数输出到屏幕上;2、 将工资大于50000的员工的工资更新为原始工资的1.5倍,如果找不到,请输出“未
11、找到工资大于50000的员工” 3、 从键盘输入员工的员工号,使用参数化游标在屏幕输出显示员工的基本信息;4、 从键盘输入员工的员工号,使用参数化游标在屏幕输出显示入职日期早于1985年12月1日的员工的基本信息;列出现有日志文件的位置和名称,显示数据库所拥有的重做日志文件组号,成员的数量和日志文件的大小 select group#,sequence#,members,bytes,status,archived from v$log; select * from v$logfile;查询数据库的归档模式,查看是否启用了自动归档 archive log list;说明当前日志组号和最大日志序列号
12、,进行手工日志切换,重新说明当前日志组号和最大序列号,select group#,sequence# from v$log;进行手工日志切换, alter system switch logfile;select group#,sequence# from v$log; 在E盘增加新的日志组,其中包含两个成员,大小为1M5、 在E:盘为每个日志组添加一个成员,要求新增日志成员的大小与原有日志成员大小一致;6、 添加一个日志文件组,参考课本P.366-P.367;7、 查看刚添加日志组的group#,sequence#,members,status信息;8、 查看刚添加日志成员文件的group#
13、,members,status信息;9、 将数据库设置为归档模式,并通过log_archive_dest_n设置两个归档文件的位置;参考课本P.367;实验截图必须包含实际归档日志的信息。三、实验数据SCOTT.EMP SCOTT.DEPTSCOTT.SALGRADE四、 思考题1、 如何将数据库设置为自动管理UNDO数据?2、 如果设置了undo_retention, Oracle overwrites undo数据块的顺序是什么?3、 查看网络资源:Oracle concepts Table 9-1 Preventable Read Phenomena by Isolation Level。总结心得 (不计分)。4、 Redo 日志组的状态active和inactive区别是什么?5、 日志成员的布局原则有哪些?6、 如何将日志组的状态由active变为inactive,由current变为active?15
©2010-2024 宁波自信网络信息技术有限公司 版权所有
客服电话:4008-655-100 投诉/维权电话:4009-655-100