资源描述
《大型数据库技术及应用》实验报告 4
实验名称: PL/SQL基础(2)
专业班级: 姓名: 学号:
实 验 日 期 : 年 月 日
一、 实验目的
1、 掌握隐式游标的基本操作;
2、 掌握游标的属性操作;
3、 掌握参数化游标的使用;
4、 掌握存储过程的创建及使用;
5、 掌握复用重做日志文件组的方法及复用重做日志成员文件的方法;
6、 掌握日志组及日志成员状态的相应视图;
7、 掌握数据库归档模式的切换;
二、 实验内容
1、 掌握隐式游标的基本操作;
2、 游标的属性操作
3、参数化游标
4、存储过程的创建及使用
实验报告填写说明:PART A 为说明部分,不要打印到实验报告中,PART B为练习部分 ,将对应的实验截图粘贴入对应位置。
PART A 说明:
1、掌握隐式游标的基本操作;
隐式游标 ---由Oracle数据库自动创建,名称是(SQL) ,主要用途是可以返回一个操作是否成功或失败.
(1) 由Oracle在内部声明,由系统管理
(2) 用于处理
-DML语句 --注意只能用于DML语句哦。
-返回单行的查询--如果使用select .. into ,则要求该select查询的结果只包含一条记录
(3) 用于判断一个操作是否成功.
SQL%notfound --返回Boolean值 存在结果集返回 False
SQL%found --返回Boolean值 存在结果集返回 True
SQL%rowcount --修改涉及到的记录的行数
SQL%isopen --在隐式游标里一般这个属性是自动打开和关闭的,且任何时候查询都返回False。
例1、
Set serveroutput on
declare
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;
2、显式游标的属性操作
(1) 是否找到游标-%FOUND
此属性表示当前游标是否指向有效的一行,取值:TRUE FALSE
例2:
Begin
Delete from emp
Where empno=7934;
If sql%found then
Dbms_output.put_line(‘delete success’);
Else
Dbms_output.put_line(‘delete fail’);
End if;
End;
说明:该例使用了隐式游标,当然,显式游标也可以使用属性%FOUND
(2)是否未找到游标-%NOTFOUND
上例等价于:
例3:
Begin
Delete from emp
Where empno=7934;
If sql%notfound then
Dbms_output.put_line(‘delete fail’);
Else
Dbms_output.put_line(‘delete success’);
End if;
End;
/
(3) 游标行数-%ROWCOUNT
此属性记录了用户成功提取数据的行数,也可以了解为游标所在的行数。
例4:
Declare
Empl emp%rowtype;
Cursor emp_cur is
Select * from emp;
Begin
Open emp_cur;
Loop
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;
(4) 是否打开游标-%ISOPEN
例5:
Declare
Empl emp%rowtype;
Cursor emp_cur is
Select * from emp;
Begin
If emp_cur%isopen then
Fetch emp_cur into empl;
Dbms_output.put_line(to_char(empl.empno));
Else
Dbms_output.put_line(‘emp_cur is not open’);
Open emp_cur;
Loop
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,该命令可以接受你的键盘输入到dept_id。
例6:
Declare
Did emp.Deptno%type:=&dept_id;
Empl emp%rowtype;
Cursor emp_cur(deptid number)is
Select * from emp where deptno=deptid;
Begin
Open emp_cur(did);
Loop
Fetch emp_cur into empl;
Dbms_output.put_line(to_char(empl.empno));
Exit when (emp_cur%rowcount=3) or (emp_cur%notfound) ;
End loop;
Close emp_cur;
End;
4、存储过程的创建及使用
所谓的存储过程就是存储在数据库中的过程,该过程与数据库中的表、视图一样属于数据库对象。
(1)语法
Create [or replace] procedure <过程名>
(<参数1>,[方式1]<数据类型1>,
<参数2>,[方式2]<数据类型2>…
)
Is|as
Pl/sql
(2) 例
例7:
创建存储过程
Create or replace procedure dept_member_num
( in_deptno in emp.deptno%type)
As
Out_num number;
Begin
Select count(*) into out_num
From emp where deptno=in_deptno;
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倍,如果找不到,请输出“未找到工资大于50000的员工”
3、 从键盘输入员工的员工号,使用参数化游标在屏幕输出显示员工的基本信息;
4、 从键盘输入员工的员工号,使用参数化游标在屏幕输出显示入职日期早于1985年12月1日的员工的基本信息;
列出现有日志文件的位置和名称,显示数据库所拥有的重做日志文件组号,成员的数量和日志文件的大小
select group#,sequence#,members,bytes,status,archived from v$log;
select * from v$logfile;
查询数据库的归档模式,查看是否启用了自动归档 archive log list;
说明当前日志组号和最大日志序列号,进行手工日志切换,重新说明当前日志组号和最大序列号,
select group#,sequence# from v$log;
进行手工日志切换,
alter system switch logfile;
select group#,sequence# from v$log;
在E盘增加新的日志组,其中包含两个成员,大小为1M
5、 在E:\盘为每个日志组添加一个成员,要求新增日志成员的大小与原有日志成员大小一致;
6、 添加一个日志文件组,参考课本P.366-P.367;
7、 查看刚添加日志组的group#,sequence#,members,status信息;
8、 查看刚添加日志成员文件的group#,members,status信息;
9、 将数据库设置为归档模式,并通过log_archive_dest_n设置两个归档文件的位置;参考课本P.367;实验截图必须包含实际归档日志的信息。
三、实验数据
SCOTT.EMP
SCOTT.DEPT
SCOTT.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
展开阅读全文