当前位置:文档之家› 实验6+过程_函数和程序...

实验6+过程_函数和程序...

实验6过程、函数和程序包姓名:学号:专业:班级:同组人:无实验日期:2013/7/21【实验目的与要求】⏹掌握过程的创建与调用⏹掌握PL/SQL函数的编写与调用⏹熟悉程序包的使用【实验内容与步骤】6.0.实验准备工作:PL/SQL程序文件的编辑与执行1.使用文档编辑器编辑以下文件,并保存为aa.sql:2.以scott身份登录,在SQ L Plus中执行@aa命令运行程序:注:测试时,文件名请用全名(即包含路径,如:@c:\aa)给出运行结果:6.1.存储过程1.最简单的存储过程编写与执行(1)创建测试表drop table Exam_Table;create table Exam_Table(e_id number(5),e_name varchar2(20),e_salary number(8,2));(2)创建存储过程create or replace procedure insert_salary (v_id number,v_name varchar2,v_salary number) isbegininsert into Exam_Table values (v_id,v_name,v_salary);commit;dbms_output.put_line('数据插入成功');end;/(3) 执行(调用)存储过程exec insert_salary(6,'g',2000);(4)查询执行结果select * from Exam_Table;给出执行的最后结果:2.参数的使用:in/out/in out参数阅读以下程序,理解不同类型参数使用的不同,运行程序,给出运行结果。

(1) 用两个参数:in ,out 传入一个姓名,输出:某某人你好:create or replace procedure mp(v_in varchar2,v_out out varchar2)isbeginv_out:=v_in||'你好';end;declarev_name varchar2(10);beginmp('scott',v_name);dbms_output.put_line(v_name);end;--输出:scott你好给出运行结果:(2)-- in out类型参数create or replace procedure mp(name_in in varchar2,name_out out varchar2,name_in_out in out varchar2) isbegindbms_output.put_line(name_in);name_out := '返回的参数name_out是' || name_in;name_in_out := 'name_in_out是' || name_in || name_in_out;end;给出运行结果:(3)定义一个返回多个值的存储过程。

create or replace procedure p_test(name out varchar2,age out number,sex out varchar2,sal out number)isbeginname:='scott';age:=26;sex:='男';sal:=8000;end;declarev_name varchar2(20);v_age number(10);v_sex varchar2(5);v_sal number(10);beginp_test(v_name,v_age,v_sex,v_sal);dbms_output.put_line(v_name);dbms_output.put_line(v_age);dbms_output.put_line(v_sex);dbms_output.put_line(v_sal);end;给出运行结果:3.练习:根据测试表完成下列程序的编写,并给出测试结果:(1)已知有如下表和相应的数据,请根据要求完成实验。

create table departments(DEPARTMENT_ID NUMBER(4) primary key,DEPARTMENT_NAME V ARCHAR2(30),MANAGER_ID NUMBER(6),LOCATION_ID NUMBER(4));insert into departments values(1,'技术部',1,1);insert into departments values(2,'人事部',2,2);insert into departments values(3,'市场部',3,3);insert into departments values(4,'财务部',4,4);根据上表结构编写存储过程,实现以下功能,并给出测试结果。

1)根据指定的部门更新指定部门名(DEPARTMENT_NAME)的管理者(MANAGER_ID)id。

2)根据部门ID(DEPARTMENT_ID)删除指定部门(2)编写给雇员增加工资的存储过程CHANGE_SALARY,通过IN类型的参数传递要增加工资的雇员编号和增加的工资额。

(操作数据库表为EMP).1)编写存储过程CHANGE_SALARY,给出程序代码:2)调用存储过程:EXECUTE CHANGE_SALARY(7788,80)6.2.函数1.最简单的函数:--简单函数(1)创建函数create function f(name in varchar2)return varchar2isbeginreturn name;end;(2)调用函数declarev_name varchar2(10);beginv_name:=f('scott');dbms_output.put_line(v_name);end;给出运行结果:2.稍微复杂的函数--编写函数create or replace function salarylevel(salary number) return varchar2 isbeginif alary < 1000 thenreturn '工资太低了,要加油了';elsif salary <3000 thenreturn '还可以,但是也要努力啊';elsif salary <5000 thenreturn '这个还可以';else'你的工资现在来说,是比较高了';end if;end;--调用函数declarev_salarylevel varchar2(50);beginv_salarylevel := salarylevel(1000);dbms_output.put_line(v_salarylevel);end;给出运行结果:3.函数练习:(1). 定义一个函数接收三个参数,算出最大值。

而后调用该函数,给出测试结果。

给出求三个数最大值函数getMax(num1,num2,num3)程序源码:--调用测试:declarev_max number(10,2);beginv_max:= getMax(10.2,34.4,34.6);dbms_output.put_line(v_max);end;给出运行结果:(2).根据房屋的相关数据(长,宽),编写函数find_area,根据公式求出其建筑面积和使用面积,并写入到数据库表中,完成后,使用Select 语句查询表中数据,以确认程序编写的正确性。

1)创建表:建立房屋表House(房屋名称,长,宽,建筑面积,使用面积);给出相应代码:2)插入三行记录测试,插入值时忽略建筑面积和使用面积'1号机房',20,5.5'2号机房',25,5.5'卧室',200,5.5给出相应代码:3)利用find_area函数,更新建筑面积和使用面积字段--建筑面积=长* 宽+ 2.5--使用面积=长* 宽给出相应代码:4)在select查询表中数据。

给出运行结果:6.3.包的声明和使用阅读以下程序,理解包的声明和使用。

-----------包的声明和使用1-------------------------DROP TABLE Exam_Emps;CREATE TABLE Exam_Emps(id number(5) primary key,name varchar2(30),commission_pct number(3,2 ));insert into Exam_Emps values (1,'张一',0.13);insert into Exam_Emps values (2,'张二',0.23);insert into Exam_Emps values (3,'张三',0.33);insert into Exam_Emps values (4,'张四',0.43);commit;select * from Exam_Emps;--创建包头CREATE OR REPLACE PACKAGE comm_packageISg_comm NUMBER := 0.10;PROCEDURE reset_comm (p_comm IN NUMBER);END comm_package;/--创建包体CREATE OR REPLACE PACKAGE BODY comm_packageIS-------------在包体中定义的局部函数--------------/*如果输入的参数p_comm大于Exam_Emps表中最大的commission_pct 字段,则函数返回FALSE,否则函数返回TRUE*/FUNCTION validate_comm (p_comm IN NUMBER)RETURN BOOLEANISv_max_comm NUMBER;BEGINSELECT MAX(commission_pct)INTO v_max_commFROM Exam_Emps;IF p_comm > v_max_comm THENRETURN FALSE ;ELSERETURN TRUE ;END IF;END validate_comm;---------在包体中定义的局部函数:结束------------------------完成在包体中声明的过程--------------PROCEDURE reset_comm (p_comm IN NUMBER)ISBEGINIF validate_comm(p_comm) THENg_comm:=p_comm;ELSERAISE_APPLICATION_ERROR(-20210, '不合理的表达式');END IF;END reset_comm;----------完成在包体中声明的过程:结束------------END comm_package;--测试包EXECUTE comm_package.reset_comm(1);EXECUTE comm_package.reset_comm(.33);给出运行结果:begincomm_package.reset_comm(0.15);dbms_output.put_line('g_comm = ' || comm_package.g_comm );end;/给出运行结果:-----------包的声明和使用2-------------------------drop table Exam_Emp;create table Exam_Emp(id number (5),name varchar2(30),salary number(8,2));insert into Exam_Emp values(1,'张一',3000); insert into Exam_Emp values(2,'张二',3400); insert into Exam_Emp values(3,'张三',5600); commit;create or replace package tax_pkg asfunction tax(v_value in number) return number; end tax_pkg;/create or replace package body tax_pkgas-------------包体中的函数执行部分--------------- function tax(v_value in number) return number isbeginif v_value < 1000 thenreturn (v_value * 0);elsif v_value < 5000 thenreturn (v_value * 0.10);elsif v_value <10000 thenreturn (v_value * 0.15);elsereturn (v_value * 0.20);end if;end tax;-------------包体中的函数:结束-----------------end tax_pkg;/-- 测试包中定义的函数select salary,tax_pkg.tax(salary) from Exam_Emp;给出运行结果:6.4 作业与思考练习题以为实验中用到的表除作特殊说明外,均为scott模式下的表,如Emp表,请在实验时,连接到scott模式。

相关主题