当前位置:文档之家› 过程_函数和程序包

过程_函数和程序包

过程、函数和和序包姓名:学号:专业:班级:同组人:实验日期:【实验目的与要求】⏹掌握过程的创建与调用⏹掌握PL/SQL函数的编写与调用⏹熟悉程序包的使用【实验内容与步骤】9.0.实验准备工作:PL/SQL程序文件的编辑与执行1.使用文档编辑器编辑以下文件,并保存为aa.sql:2.以scott身份登录,在SQ L Plus中执行@aa命令运行程序:给出运行结果:9.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 mp1(v_in in varchar2,v_out out varchar2)isbeginv_out:=v_in||'你好';end;declarev_name varchar2(10);beginmp1('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) is begindbms_output.put_line(name_in);name_out:= '返回的参数name_out是' || name_in;name_in_out := 'name_in_out是' || name_in || name_in_out;end;variable name_out varchar2(100);variable name_in_out varchar2(20);exec mp('11',:name_out,:name_in_out);print给出运行结果:(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。

CREATE OR REPLACE PROCEDUREDEP_PRO(V_DEP_NAME IN VARCHAR2,V_DEP_ID IN NUMBER)ISBEGINUPDATE DEPARTMENTSSET MANAGER_ID =V_DEP_IDWHERE DEPARTMENT_NAME =V_DEP_NAME;END;DECLAREBEGINDEP_PRO('技术部',5);END;更新前:更新后:2)根据部门ID(DEPARTMENT_ID)删除指定部门CREATE OR REPLACE PROCEDUREDEP_DEL_PRO(V_DEP_NAME IN VARCHAR2)ISBEGINDELETE DEPARTMENTSWHERE DEPARTMENT_NAME=V_DEP_NAME;END;--DECLAREBEGINDEP_DEL_PRO('技术部');END;(2)编写给雇员增加工资的存储过程CHANGE_SALARY,通过IN类型的参数传递要增加工资的雇员编号和增加的工资额。

(操作数据库表为EMP).1)编写存储过程CHANGE_SALARY,给出程序代码:CREATE OR REPLACE PROCEDURECHANGE_SALARY(P_EMPNO IN NUMBER DEFAULT 7788,P_RAISE NUMBER DEFAULT 10)ISV_ENAME VARCHAR2(10);V_SAL NUMBER(5);BEGINSELECT ENAME,SAL INTO V_ENAME,V_SAL FROM EMP WHERE EMPNO=P_EMPNO;UPDATE EMP SET SAL=SAL+P_RAISE WHERE EMPNO=P_EMPNO;DBMS_OUTPUT.PUT_LINE('雇员'||V_ENAME||'的工资被改为'||TO_CHAR(V_SAL+P_RAISE));COMMIT;EXCEPTIONWHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('发生错误,修改失败!');ROLLBACK;END;2)调用存储过程:EXECUTE CHANGE_SALARY(7788,80)9.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 varchar2isbeginif salary < 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). 定义一个函数接收三个参数,算出最大值。

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

给出求三个数最大值函数Max(num1,num2,num3)程序源码:SET SERVEROUTPUT ON;CREATE OR REPLACE PROCEDURE MYPROCEDURE(V_NUM1FLOAT,V_NUM2 FLOAT,V_NUM3 FLOAT)ISBEGINIF(V_NUM1>V_NUM2) THENIF (V_NUM3>V_NUM1) THENDBMS_OUTPUT.PUT_LINE(V_NUM3);ELSEDBMS_OUTPUT.PUT_LINE(V_NUM1);END IF;ELSEIF (V_NUM2>V_NUM3) THENDBMS_OUTPUT.PUT_LINE(V_NUM2);ELSEDBMS_OUTPUT.PUT_LINE(V_NUM3);END IF;END IF;END;--调用测试:DECLAREV1 FLOAT:=10.2;V2 FLOAT:=34.4;V3 FLOAT:=34.6;BEGINMYPROCEDURE(V1,V2,V3);END;给出运行结果:(2).根据房屋的相关数据(长,宽),编写函数find_area,根据公式求出其建筑面积和使用面积,并写入到数据库表中,完成后,使用Select 语句查询表中数据,以确认程序编写的正确性。

相关主题