包
包的组成
包由两部分组成 分别为包的声明部分和包的实现部分
包的声明部分
CREATE OR REPLACE PACKAGE PKG_1
IS
END ;
包的实现部分
CREATE OR REPLACE PACKAGE BODY PKG_1
IS
END ;
包的作用
- 使用包将程序分组归类
- 使用私有方法隐藏逻辑
CREATE OR REPLACE PACKAGE PKG_YUAN
IS
PI CONSTANT NUMBER :=3.14;
FUNCTION GET_YUAN_ZHUI_TI_JI (IN_R NUMBER , IN_H NUMBER )
RETURN NUMBER ;
END ;
包的实现部分
CREATE OR REPLACE PACKAGE BODY PKG_YUAN IS
--获取圆面积
FUNCTION GET_YUAN_MIAN_JI(IN_R NUMBER) RETURN NUMBER IS
BEGIN
RETURN IN_R * IN_R * PI;
END;
--获取圆柱体积
FUNCTION GET_YUAN_ZHU_TI_JI(IN_R NUMBER, IN_H NUMBER) RETURN NUMBER IS
V_MIAN_JI NUMBER;
BEGIN
V_MIAN_JI := GET_YUAN_MIAN_JI(IN_R);
RETURN V_MIAN_JI * IN_H;
END;
--获取圆锥体积
FUNCTION GET_YUAN_ZHUI_TI_JI(IN_R NUMBER, IN_H NUMBER) RETURN NUMBER IS
BEGIN
RETURN GET_YUAN_ZHU_TI_JI(IN_R, IN_H) / 3;
END;
END;
在上面的例子中,我们将与圆相关的计算功能放入到一个包中.
我们还可以再将与正方形相关的计算功能放入另一个包中.
这样我们就通过包实现的程序的分类
包的私有方法
在包的实现部分中存在三个函数,而在包的声明部分只存在一个函数.
存放在包实现部分,但未在包声明部分出现的函数或过程我们称之为包的私有函数/过程
私有函数/过程只能被包内的其他函数过程调用.
并且被调用的私有过程/函数要写在调用者之前.
否则报错
包的声明部分
CREATE OR REPLACE PACKAGE PKG_YUAN_1
IS
PI CONSTANT NUMBER :=3.14;
FUNCTION GET_YUAN_ZHUI_TI_JI (IN_R NUMBER , IN_H NUMBER )
RETURN NUMBER ;
END ;
包的实现部分
CREATE OR REPLACE PACKAGE BODY PKG_YUAN_1 IS
--获取圆锥体积
FUNCTION GET_YUAN_ZHUI_TI_JI(IN_R NUMBER, IN_H NUMBER) RETURN NUMBER IS
BEGIN
RETURN GET_YUAN_ZHU_TI_JI(IN_R, IN_H) / 3;
END;
--获取圆面积
FUNCTION GET_YUAN_MIAN_JI(IN_R NUMBER) RETURN NUMBER IS
BEGIN
RETURN IN_R * IN_R * PI;
END;
--获取圆柱体积
FUNCTION GET_YUAN_ZHU_TI_JI(IN_R NUMBER, IN_H NUMBER) RETURN NUMBER IS
V_MIAN_JI NUMBER;
BEGIN
V_MIAN_JI := GET_YUAN_MIAN_JI(IN_R);
RETURN V_MIAN_JI * IN_H;
END;
END;
编译错误
函数 GET_YUAN_ZHUI_TI_JI 引用了GET_YUAN_ZHU_TI_JI
由于GET_YUAN_ZHUI_TI_JI在引用了GET_YUAN_ZHU_TI_JI之前,引发此报错.
PACKAGE BODY DAO.PKG_YUAN_1 编译错误
错误:PLS-00313: 'GET_YUAN_ZHU_TI_JI' not declared in this scope
行:6
文本:RETURN GET_YUAN_ZHU_TI_JI(IN_R, IN_H) / 3;
错误:PL/SQL: Statement ignored
行:6
文本:RETURN GET_YUAN_ZHU_TI_JI(IN_R, IN_H) / 3;