成绩: 实 验 报 告
课程名称: 实验项目: 姓 名: 专 业: 班 级: 学 号:
Oracle数据库实用教程
游标与例外
计算机科学与技术
计算机科学与技术学院
年 月日
哈尔滨理工大学计算机科学与技术学院 实验报告
实验项目名称: 游标与例外
一、实验目的
掌握存储过程、函数的语法,可以用它解决具体问题。 编写存储过程、函数实现数据库操作的具体要求
二、实验内容
1、对INSERT、UPDATE、DELETE、SELECT等语句产生的隐式游标进行测试,读取并利用隐式游标的属性值
2、定义显式游标并用基本LOOP循环以及游标FOR循环语句对其进行处理,将游标对应记录值显示输出
3、使用游标更新记录,练习FOR UPDATE子句及WHERE CURRENT OF 条件 4、创建一个表并插入、删除、修改记录,测试引发并处理TOO_MANY_ROWS和NO_DATA_FOUND等预定义例外
5、自定义例外并通过插入或修改数据引发该例外,捕获并输出相应提示信息
6、捕获非Oracle预定义例外。对Oracle返回的某个错误号,进行捕获(参考错误处理手册,设计常用的错误处理例行程序)
7、使用RAISE_APPLICATION_ERROR返回自定义例外号和出错返回信息
三、实验截图与部分代码
1、用FOR循环处理游标。 CONN scott/wawawa@oooo DECLARE
v_bonus NUMBER;
CURSOR emp_cursor IS SELECT ename,sal,comm FROM emp; BEGIN
DELETE FROM bonus;
FOR emp_rec IN emp_cursor LOOP
v_bonus:= (emp_rec.sal*0.05)+(nvl(emp_rec.comm,0)*0.25); INSERT INTO BONUS(ename,sal,comm)
VALUES(emp_rec.ename,emp_rec.sal,v_bonus); END LOOP; COMMIT; END; /
哈尔滨理工大学计算机科学与技术学院实验教学中心 实验报告
2、按年度基本工资额用游标修改emp表中记录的sal字段值,如年基本工资低于30000,sal增加20%,否则sal增加15%。 CONN scott/wawawa@oooo DECLARE
v_sal NUMBER(7,2);
CURSOR emp_cur IS SELECT 12*sal FROM emp FOR UPDATE; BEGIN
OPEN emp_cur; LOOP
FETCH emp_cur INTO v_sal; EXIT WHEN emp_cur%NOTFOUND; IF v_sal<30000 THEN
UPDATE emp SET sal=sal*1.2 WHERE CURRENT OF emp_cur; ELSE
UPDATE emp SET sal=sal*1.15 WHERE CURRENT OF emp_cur; END IF; END LOOP;
CLOSE emp_cur; COMMIT; END; /
SET PAGESIZE 200 SET LINESIZE 100 SELECT * FROM emp;
哈尔滨理工大学计算机科学与技术学院实验教学中心 实验报告
3、预定义例外的捕获和处理。 CONN scott/wawawa@oooo CREATE TABLE test_msg( empno NUMBER(4),
message VARCHAR2(20));
SET serveroutput ON DECLARE
v_sal NUMBER; BEGIN
SELECT sal INTO v_sal FROM emp WHERE empno=888;
DBMS_OUTPUT.PUT_LINE('888的工资是:'||to_char(v_sal));
哈尔滨理工大学计算机科学与技术学院实验教学中心 实验报告
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('发生NO_DATA_FOUND例外'); INSERT INTO test_msg(empno,message) VALUES(888,'not exists'); COMMIT;
WHEN OTHERS THEN ROLLBACK WORK; END; /
4、删除指定编号的雇员,返回用户自定义的错误号和错误信息。
CONN hr/wawawa@oooo SET serveroutput ON SET verify OFF
DEFINE p_empno = 205 DECLARE
e_emps_remaining EXCEPTION;
PRAGMA EXCEPTION_INIT (e_emps_remaining,-2292); BEGIN
DELETE FROM employees
WHERE employee_id = &p_empno; IF SQL%NOTFOUND THEN
RAISE_APPLICATION_ERROR(-20001,
'指定的雇员编号'||TO_CHAR(&p_empno)||'不存在',TRUE); END IF; COMMIT; EXCEPTION
WHEN e_emps_remaining THEN
RAISE_APPLICATION_ERROR(-20002,'不能删除雇员:'
||TO_CHAR(&p_empno)||',还有记录参照该雇员编号',TRUE);
哈尔滨理工大学计算机科学与技术学院实验教学中心 实验报告
END; /
四、实验心得
通过实验课程加深了我对理论课程的理解、掌握、和运用。掌握了存储过程、函数的语法,可以用它解决具体问题,也掌握了编写存储过程、函数实现数据库操作的具体要求的技能,亲自实践很重要。
因篇幅问题不能全部显示,请点此查看更多更全内容