《Oracle数据库》实验指导书级 联系客服

发布时间 : 星期三 文章《Oracle数据库》实验指导书级更新完毕开始阅读a4a24957336c1eb91a375de2

实验四 PL/SQL子程序 (2学时)

【实验目的】 (1)掌握创建PL/SQL子程序的方法。

(2) 掌握利用PL/SQL子程序提高代码重用性的方法。 【实验内容】

一、 PL/SQL子程序概述

在PL/SQL中,子程序是命名的PL/SQL块,它可以带参数,能被PL/SQL块等调用。子程序有两种:过程和函数。一般可使用一个过程执行某种特定的操作,使用一个函数完成某种计算获得一个值。

利用过程和函数子程序,用户可以对自己的PL/SQL块命名以创建模块代码,提高对代码的重用。

子程序与未命名的或无名的PL/SQL块一样,也由三部分组成:说明部分、可执行部分和可选的异常处理部分。各部分的内容分别与PL/SQL块相同。在子程序和PL/SQL块的说明部分,除说明类型、变量、常量、游标和异常外,还可以说明子程序,即嵌套子程序。该嵌套子程序的使用范围仅限于说明它的当前模块。 1、定义过程子程序

定义过程的语法格式为:

PROCEDURE 过程名[ (参数表)] IS 说明部分 BEGIN 执行部分 EXCEPTION 异常处理程序 END;

每个参数的说明格式为:

参数名[IN或OUT或IN OUT]数据类型[:=或DEFAULT值] 参数有以下三种类型:

(1)IN参数类型:表示输入给过程的参数。

(2)OUT参数类型:表示参数在过程中将被赋值,可以传给过程体的外部。

(3)IN OUT参数类型:表示该类参数既可以向过程体传值,也可以在过程体中赋值,以便向过程体外传值。 2、定义函数子程序

函数子程序类似于过程子程序,它具有一个函数说明和一个函数体。过程的函数之间的主要差异在于:函数返回一个计算值。 定义函数的语法格式为:

FUNCTION 函数名[ (参数表)] RETURN 返回值类型 IS 说明部分 BEGIN

执行部分(至少有一个RETURN语句返回一个值) EXCEPTION 异常处理程序 END;

9

二、 实验内容

1、 设计一个过程子程序,根据输入职工所在的部门号和职工名来修改该职工的工资;若该

职工的部门号为10,则工资加$100;若部门号为20,则工资加¥300;否则工资加¥200.(设部门号与职工名作为过程的输入形式参数) 程序的代码如下:

PROCEDURE rais_sal(dept_no integer,v_name varchar2) IS addsal real; v_sal number;

salary_mis EXCEPTION; BEGIN

select sal into v_sal from emp

where ename=v_name and deptno=dept_no; IF v_sal IS NULL THEN RAISE salary_mis; elsif dept_no=10 then addsal:=100; elsif dept_no=20 then addsal:=300; else addsal:=200; END IF; update emp

set sal=sal+addsal

where ename=v_name and deptno=dept_no; COMMIT WORK; EXCEPTION

WHEN NO_DATA_FOUND THEN

dbms_output.putline(’没有找到职工’||v_name); WHEN salary_mis THEN

dbms_output.putline(v_name||’工资是空的,有错误!’); WHEN Others THEN

dbms_output.putline(’发现其他错误!’);

END rais_sal; /*在END后,可以给出本过程名,表示过程到此结束*/ 过程调用为一个PL/SQL语句,其语句调用形式为: rais_sal(10,’SCOTT’);

2、 定义一个函数子程序,根据输入的职工号计算该职工的年收入总额。 程序如下:

FUNCTION compsumal(v_empno number) RETURN real IS /*函数返回值是实型值*/ sum_sal real; BEGIN

select 12*(sal+nvl(comm,0)) INTO sum_sal from emp /* nvl(参数1,参数2) 为空值处理函数参见课本P88* / where emono= v_empno; RETURN(sum_sal); EXCEPTION

WHEN NO_DATA_FOUND THEN dbms_output.putline(’没有找到职工!’);

10

return(-1);

WHEN Others THEN

dbms_output.put_line(’发现其他错误!’); return(-2);

END compsumal; /*在END 后的函数名compsumal 是可选的,可以省略*/ 可用如下PL/SQL赋值语句调用上述函数: y_sum:= compsumal(7788);

在主调函数中可以对y_sum的值进行判断。如果是-1,说明未找到该职工,不能计算;如果是-2,说明有其他错误,否则就是要计算该职工的年收入总额。

3、 写过程子程序,以雇员名为参数,显示所指定雇员名所在的部门名和位置,并调用这个

子程序。

4、 写函数子程序,以部门号为参数,计算该部门职工的总人数,并调用这个子程序。

11