DBMS_OUTPUT.PUT_LINE('雇员职务:'||EMPLOYE.JOB); DBMS_OUTPUT.PUT_LINE('雇员工资:'||EMPLOYE.SAL); DBMS_OUTPUT.PUT_LINE('部门编号:'||EMPLOYE.DEPTNO); END SHOW_DETAIL;
----------------- 从EMP表取得一个雇员 -------------------- PROCEDURE GET_EMPLOYE(P_EMPNO NUMBER) AS BEGIN
SELECT * INTO EMPLOYE from EMP WHERE EMPNO=P_EMPNO; DBMS_OUTPUT.PUT_LINE('获取雇员'||EMPLOYE.ENAME||'信息成功'); EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('获取雇员信息发生错误!'); END GET_EMPLOYE;
---------------------- 保存雇员到EMP表 -------------------------- PROCEDURE SAVE_EMPLOYE AS BEGIN
UPDATE EMP SET ENAME=EMPLOYE.ENAME, SAL=EMPLOYE.SAL WHERE EMPNO=
EMPLOYE.EMPNO;
DBMS_OUTPUT.PUT_LINE('雇员信息保存完成!'); END SAVE_EMPLOYE;
---------------------------- 修改雇员名称 ------------------------------ PROCEDURE CHANGE_NAME(P_NEWNAME VARCHAR2) AS BEGIN
EMPLOYE.ENAME:=P_NEWNAME;
DBMS_OUTPUT.PUT_LINE('修改名称完成!'); END CHANGE_NAME;
---------------------------- 修改雇员工资 -------------------------- PROCEDURE CHANGE_SAL(P_NEWSAL NUMBER) AS BEGIN
EMPLOYE.SAL:=P_NEWSAL;
DBMS_OUTPUT.PUT_LINE('修改工资完成!');
END CHANGE_SAL; END EMPLOYE;
步骤2:获取雇员7788的信息: Sql代码
SET SERVEROUTPUT ON
EXECUTE EMPLOYE.GET_EMPLOYE(7788); SET SERVEROUTPUT ON
EXECUTE EMPLOYE.GET_EMPLOYE(7788); 结果为: Sql代码
获取雇员SCOTT信息成功 PL/SQL 过程已成功完成。 获取雇员SCOTT信息成功 PL/SQL 过程已成功完成。 步骤3:显示雇员信息: Sql代码
EXECUTE EMPLOYE.SHOW_DETAIL; EXECUTE EMPLOYE.SHOW_DETAIL; 结果为: Sql代码
------------------ 雇员信息 ------------------ 雇员编号:7788 雇员名称:SCOTT 雇员职务:ANALYST 雇员工资:3000 部门编号:20
PL/SQL 过程已成功完成。 ------------------ 雇员信息 ------------------ 雇员编号:7788 雇员名称:SCOTT 雇员职务:ANALYST 雇员工资:3000 部门编号:20
PL/SQL 过程已成功完成。 步骤4:修改雇员工资: Sql代码
EXECUTE EMPLOYE.CHANGE_SAL(3800); EXECUTE EMPLOYE.CHANGE_SAL(3800); 结果为: Sql代码 修改工资完成!
PL/SQL 过程已成功完成。 修改工资完成!
PL/SQL 过程已成功完成。
步骤5:将修改的雇员信息存入EMP表 Sql代码
EXECUTE EMPLOYE.SAVE_EMPLOYE; EXECUTE EMPLOYE.SAVE_EMPLOYE; 结果为: Sql代码
雇员信息保存完成!
PL/SQL 过程已成功完成。 雇员信息保存完成! PL/SQL 过程已成功完成。
说明:该包完成将EMP表中的某个雇员的信息取入内存记录变量,在记录变量中进行修改编辑,在确认显示信息正确后写回EMP表的功能。记录变量EMPLOYE用来存储取得的雇员信息,定义为私有变量,只能被包的内部模块访问。 【练习1】为包增加修改雇员职务和部门编号的功能。 阶段训练
下面的训练通过定义和创建完整的包EMP_PK并综合运用本章的知识,完成对雇员表的插入、删除等功能,包中的主要元素解释如下所示。 Sql代码
程序结构 类 型 说 明
V_EMP_COUNT 公有变量 跟踪雇员的总人数变化,插入、删除雇员的同时修改该变量的值
INIT 公有过程 对包进行初始化,初始化雇员人数和工资修改的上、下限 LIST_EMP 公有过程 显示雇员列表
INSERT_EMP 公有过程 通过编号插入新雇员 DELETE_EMP 公有过程 通过编号删除雇员
CHANGE_EMP_SAL 公有过程 通过编号修改雇员工资 V_MESSAGE 私有变量 存放准备输出的信息 C_MAX_SAL 私有变量 对工资修改的上限
C_MIN_SAL 私有变量 对工资修改的下限
SHOW_MESSAGE 私有过程 显示私有变量V_MESSAGE中的信息
EXIST_EMP 私有函数 判断某个编号的雇员是否存在,该函数被INSERT_EMP、DELETE_EMP和CHANGE_EMP_SAL等过程调用 程序结构 类 型 说 明
V_EMP_COUNT 公有变量 跟踪雇员的总人数变化,插入、删除雇员的同时修改该变量的值 INIT 公有过程 对包进行初始化,初始化雇员人数和工资修改的上、下限 LIST_EMP 公有过程 显示雇员列表
INSERT_EMP 公有过程 通过编号插入新雇员 DELETE_EMP 公有过程 通过编号删除雇员
CHANGE_EMP_SAL 公有过程 通过编号修改雇员工资 V_MESSAGE 私有变量 存放准备输出的信息 C_MAX_SAL 私有变量 对工资修改的上限 C_MIN_SAL 私有变量 对工资修改的下限
SHOW_MESSAGE 私有过程 显示私有变量V_MESSAGE中的信息
EXIST_EMP 私有函数 判断某个编号的雇员是否存在,该函数被INSERT_EMP、DELETE_EMP和CHANGE_EMP_SAL等过程调用 【训练1】 完整的雇员包EMP_PK的创建和应用。
步骤1:在SQL*Plus中登录SCOTT账户,输入以下包头和包体部分,按“执行”按钮编译: Sql代码
CREATE OR REPLACE PACKAGE EMP_PK --包头部分 IS
V_EMP_COUNT NUMBER(5); --雇员人数
PROCEDURE INIT(P_MAX NUMBER,P_MIN NUMBER); --初始化 PROCEDURE LIST_EMP; --显示雇员列表
PROCEDURE INSERT_EMP(P_EMPNO NUMBER,P_ENAMEVARCHAR2,P_JOB VARCHAR2,
P_SAL NUMBER); --插入雇员
PROCEDURE DELETE_EMP(P_EMPNO NUMBER); --删除雇员
PROCEDURE CHANGE_EMP_SAL(P_EMPNO NUMBER,P_SAL NUMBER); --修改雇员工资 END EMP_PK;
/CREATE OR REPLACE PACKAGE BODY EMP_PK --包体部分 IS
V_MESSAGE VARCHAR2(50); --显示信息 V_MAX_SAL NUMBER(7); --工资上限 V_MIN_SAL NUMBER(7); --工资下限
FUNCTION EXIST_EMP(P_EMPNO NUMBER) RETURN BOOLEAN; --判断雇员是否存在函数
PROCEDURE SHOW_MESSAGE; --显示信息过程 ------------------------------- 初始化过程 ---------------------------- PROCEDURE INIT(P_MAX NUMBER,P_MIN NUMBER) IS BEGIN
SELECT COUNT(*) INTO V_EMP_COUNT from EMP; V_MAX_SAL:=P_MAX; V_MIN_SAL:=P_MIN;
V_MESSAGE:='初始化过程已经完成!'; SHOW_MESSAGE; END INIT;
---------------------------- 显示雇员列表过程 --------------------- PROCEDURE LIST_EMP IS BEGIN
DBMS_OUTPUT.PUT_LINE('姓名 职务 工资'); FOR emp_rec IN (SELECT * from EMP) LOOP
DBMS_OUTPUT.PUT_LINE(RPAD(emp_rec.ename,10,'')||RPAD(emp_rec.job,10,' ')||TO_CHAR(emp_rec.sal)); END LOOP;
DBMS_OUTPUT.PUT_LINE('雇员总人数'||V_EMP_COUNT); END LIST_EMP;
----------------------------- 插入雇员过程 -----------------------------
PROCEDUREINSERT_EMP(P_EMPNO NUMBER,P_ENAMEVARCHAR2,P_JOB VARCHAR2,P_SAL NUMBER) IS BEGIN