BEGIN
DBMS_OUTPUT.PUT_LINE('提示信息:'||V_MESSAGE); END SHOW_MESSAGE;
------------------------ 判断雇员是否存在函数 ------------------- FUNCTION EXIST_EMP(P_EMPNO NUMBER) RETURN BOOLEAN IS
V_NUM NUMBER; --局部变量 BEGIN
SELECT COUNT(*) INTO V_NUM from EMP WHERE EMPNO=P_EMPNO; IF V_NUM=1 THEN RETURN TRUE; ELSE
RETURN FALSE; END IF;
END EXIST_EMP; ----------------------------- END EMP_PK; 结果为: Sql代码 程序包已创建。 程序包主体已创建。 程序包已创建。 程序包主体已创建。 步骤2:初始化包: Sql代码
SET SERVEROUTPUT ON
EXECUTE EMP_PK.INIT(6000,600); SET SERVEROUTPUT ON
EXECUTE EMP_PK.INIT(6000,600); 显示为: Sql代码
提示信息:初始化过程已经完成! 提示信息:初始化过程已经完成! 步骤3:显示雇员列表: Sql代码
EXECUTE EMP_PK.LIST_EMP; EXECUTE EMP_PK.LIST_EMP; 显示为: Sql代码
姓名 职务 工资 SMITH CLERK 1560 ALLEN SALESMAN 1936 WARD SALESMAN 1830 JONES MANAGER 2975 ...
雇员总人数:14
PL/SQL 过程已成功完成。 姓名 职务 工资 SMITH CLERK 1560 ALLEN SALESMAN 1936 WARD SALESMAN 1830 JONES MANAGER 2975 ...
雇员总人数:14
PL/SQL 过程已成功完成。 步骤4:插入一个新记录: Sql代码
EXECUTE EMP_PK.INSERT_EMP(8001,'小王','CLERK',1000); EXECUTE EMP_PK.INSERT_EMP(8001,'小王','CLERK',1000); 显示结果为: Sql代码
提示信息:雇员8001已插入! PL/SQL 过程已成功完成。 提示信息:雇员8001已插入! PL/SQL 过程已成功完成。
步骤5:通过全局变量V_EMP_COUNT查看雇员人数: Sql代码 BEGIN
DBMS_OUTPUT.PUT_LINE(EMP_PK.V_EMP_COUNT); END; BEGIN
DBMS_OUTPUT.PUT_LINE(EMP_PK.V_EMP_COUNT); END; 显示结果为: Sql代码 15
PL/SQL 过程已成功完成。 15
PL/SQL 过程已成功完成。 步骤6:删除新插入记录: Sql代码
EXECUTE EMP_PK.DELETE_EMP(8001); EXECUTE EMP_PK.DELETE_EMP(8001); 显示结果为: Sql代码
提示信息:雇员8001已删除! PL/SQL 过程已成功完成。 提示信息:雇员8001已删除! PL/SQL 过程已成功完成。 再次删除该雇员: Sql代码
EXECUTE EMP_PK.DELETE_EMP(8001); EXECUTE EMP_PK.DELETE_EMP(8001); 结果为: Sql代码
提示信息:雇员8001不存在,不能删除! 提示信息:雇员8001不存在,不能删除! 步骤7:修改雇员工资: Sql代码
EXECUTE EMP_PK.CHANGE_EMP_SAL(7788,8000); EXECUTE EMP_PK.CHANGE_EMP_SAL(7788,8000); 显示结果为: Sql代码
提示信息:工资超出修改范围! PL/SQL 过程已成功完成。 提示信息:工资超出修改范围! PL/SQL 过程已成功完成。
步骤8:授权其他用户调用包:
如果是另外一个用户要使用该包,必须由包的所有者授权,下面授予STUDEN账户对该包的使用权: Sql代码
GRANT EXECUTE ON EMP_PK TO STUDENT; GRANT EXECUTE ON EMP_PK TO STUDENT;
每一个新的会话要为包中的公用变量开辟新的存储空间,所以需要重新执行初始化过程。两个会话的进程互不影响。 步骤9:其他用户调用包。
启动另外一个SQL*Plus,登录STUDENT账户,执行以下过程: Sql代码
SET SERVEROUTPUT ON
EXECUTE SCOTT.EMP_PK. EMP_PK.INIT(5000,700); SET SERVEROUTPUT ON
EXECUTE SCOTT.EMP_PK. EMP_PK.INIT(5000,700); 结果为: Sql代码
提示信息:初始化过程已经完成! PL/SQL 过程已成功完成。 提示信息:初始化过程已经完成! PL/SQL 过程已成功完成。
说 明:在初始化中设置雇员的总人数和修改工资的上、下限,初始化后V_EMP_COUNT为14人,插入雇员后V_EMP_COUNT为15人。 V_EMP_COUNT为公有变量,所以可以在外部程序中使用DBMS_OUTPUT.PUT_LINE输出,引用时用 EMP_PK.V_EMP_COUNT的形式,说明所属的包。而私有变量V_MAX_SAL和V_MIN_SAL不能被外部访问,只能通过内部过程来修 改。同样,EXIST_EMP和SHOW_MESSAGE也是私有过程,也只能在过程体内被其他模块引用。
注意:在最后一个步骤中,因为STUDENT模式调用了SCOTT模式的包,所以包名前要增加模式名SCOTT。不同的会话对包的调用属于不同的应用,所以需要重新进行初始化。 练习
1.如果存储过程的参数类型为OUT,那么调用时传递的参数应该为: A.常量 B.表达式 C.变量 D.都可以 2.下列有关存储过程的特点说法错误的是: A.存储过程不能将值传回调用的主程序 B.存储过程是一个命名的模块 C.编译的存储过程存放在数据库中
D.一个存储过程可以调用另一个存储过程 3.下列有关函数的特点说法错误的是: A.函数必须定义返回类型 B.函数参数的类型只能是IN
C.在函数体内可以多次使用RETURN语句 D.函数的调用应使用EXECUTE命令 4.包中不能包含的元素为: A.存储过程 B.存储函数 C.游标 D.表
5.下列有关包的使用说法错误的是: A.在不同的包内模块可以重名 B.包的私有过程不能被外部程序调用 C.包体中的过程和函数必须在包头部分说明 D.必须先创建包头,然后创建包体