实验7 过程和函数
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据库开发技术》课程之实验七
PL/SQL过程和函数
1、实验目的
1.掌握正确使用异常处理的方法。
2.掌握局部(本地)过程和存储过程的正确使用方法。
3.掌握局部(本地)函数和存储函数的正确使用方法。
2、实验内容和要求
1. 创建一个显示EMP表中雇员总人数的存储过程。然后在程序块
中和SQL*Plus环境中调用该存储过程。
执行结果:
雇员总人数为:17
2. 编写一个存储函数函数,用于判断DEPT表中某一编号的部门是
否存在,若存在此部门编号,则返回TRUE,否则返回FALSE。
3. 编写一过程,调用第2题的函数判断某一编号的部门是否存在,
存在则输出该部门员工的姓名、工作,否则提示不存在此部门
或此部门无员工。
4. 调用第2题的存储函数,查询并显示30号部门的人数。要求函数
体内有对不存在部门的异常处理,给用户的错误指示信息是:
该部门不存在!
5. 有一个权限控制的表中有三个字段,分别存放用户姓名、密码
和权限级别。创建一个用户登录存储函数,用户登录时核对用
户名和密码,正确则函数返回真,否则返回假。要求有适当的
异常处理,还要求进行适当的测试以验证函数的正确性。Create table login(uname varchar(12), pw varchar(12), right_lel varchar(12)); insert into login values('xiaoli','12345','DBA');
insert into login values('zhangsan','zzz','GUEST');
--登录函数测试
输入 user_name 的值: xiaoli
输入 password 的值: 12345
登录成功!
PL/SQL 过程已成功完成。
6. *阅读、理解并执行以下程序,并在注释处完成填空,指明当条
语句的作用或意义,一行不够写自行加一行注释。最后要求写
出你的上机执行结果,对此执行结果写出一句总结。
DECLARE
TYPE EmpTabTyp IS TABLE OF emp%ROWTYPE; --
emp_tab EmpTabTyp := EmpTabTyp(NULL); --
t1 NUMBER(5);
t2 NUMBER(5);
t3 NUMBER(5);
PROCEDURE get_time (t OUT NUMBER) IS -- 过程头:创建过程,过程有一
个输出
--参数, 参数模式为,参数类型是
型。
/* 'SSSSS'日期/时间格式的含义为:距离午夜的秒数(0 ~ 86399)。*/
BEGIN --以下语句将赋给输出参数。
SELECT TO_CHAR(SYSDATE,'SSSSS') INTO t FROM dual;
END;
PROCEDURE do_nothing1 (tab IN OUT EmpTabTyp) IS --过程有一个
模式的参数tab,数
-- 据类型是,根据PL/SQL的默认方式,实参与形参间是按
传递的。
BEGIN
NULL; -- 过程do_nothing1是一个什么也不做的过程
END;
PROCEDURE do_nothing2 (tab IN OUT NOCOPY EmpTabTyp) IS --过
程有一个IN OUT模式的参
-- 数tab,实参与形参间由于有,所以是按传递的。
BEGIN NULL; END;
BEGIN
T * INTO emp_tab(1) FROM emp WHERE empno = 7788; -- 将雇员7788的信息存入
表元
-- 素1中
emp_tab.EXTEND(249999, 1); --
-- 。
get_time(t1);
do_nothing1(emp_tab); -- 将嵌套表emp_tab传递给过程do_nothing1
的IN OUT 形参
get_time(t2);
do_nothing2(emp_tab); -- 将嵌套表传递给过程do_nothing2的IN OUT NOCOPY形参
get_time(t3);
dbms_output.put_line('Call Duration (secs)');
dbms_output.put_line('--------------------');
dbms_output.put_line('Just IN OUT: ' || TO_CHAR(t2 - t1)); --显示出
执行用时(秒)。
dbms_output.put_line('With NOCOPY: ' || TO_CHAR(t3 - t2)); --显示出执行用时(秒)。
END;
/
Call Duration (secs) --250000条记录,即25万条记录
--------------------
Just IN OUT: 2
With NOCOPY: 0
PL/SQL 过程已成功完成。
Call Duration (secs) --2500000条记录,即250万条记录
--------------------
Just IN OUT: 381
With NOCOPY: 0
PL/SQL 过程已成功完成。
3、实验报告
记录实验过程中遇到的困难和解决问题的方法。
4、实验小结
分析本次实验主要综合运用了哪些知识点,你的运用情况如何等。