博客
关于我
Oracle进阶(六)包(Package)和包体
阅读量:332 次
发布时间:2019-03-04

本文共 3865 字,大约阅读时间需要 12 分钟。

1、包(Package)概述

包(Package)是Oracle中用来存储程序结构的对象,通常存储在数据字典中。包由两个部分组成:包规范(PACKAGE)和包体(PACKAGE BODY)。包规范是对外的操作接口,类似于Java的接口,对应用是可见的;而包体是具体的实现部分,类似于Java的实现类,对应用不可见。

包的关键元素包括公有元素(PUBLIC)、私有元素(PRIVATE)和局部变量(LOCAL)。公有元素在包头中声明,在包体中具体实现,对整个应用有效;私有元素仅在包体中定义,仅对包内其他部分可用;局部变量仅在特定过程或函数中使用。

1.1 包说明

包头中的公有元素对外可见且可用,而私有元素仅对包体内部可用。局部变量仅在特定过程或函数中定义和使用。

1.2 系统包

Oracle提供了多个系统包,常用的包括:

包名称 描述
DBMS_OUTPUT 用于在SQL*Plus环境下输出信息
DBMS_DDL 提供编译过程函数和包
DBMS_SESSION 用于改变用户会话和初始化包
DBMS_TRANSACTION 控制数据库事务
DBMS_MAIL 连接Oracle*Mail
DBMS_LOCK 管理复杂的锁机制
DBMS_ALERT 识别和处理数据库事件告警
DBMS_PIPE 在会话间通过管道传递信息
DBMS_JOB 管理Oracle作业
DBMS_LOB 操作大对象(LOB)
DBMS_SQL 执行动态SQL语句

2、基本语法

2.1 创建包和包体

创建包和包体的语法如下:

创建包规范:CREATE [OR REPLACE] PACKAGE 包名 IS    -- 定义变量、常量、类型、游标等    -- 定义函数和存储过程    EXCEPTIONEND [包名];
创建包体:CREATE [OR REPLACE] PACKAGE BODY 包名 IS    -- 实现函数和存储过程    EXCEPTIONEND [包名];

2.2 其他常用语法

删除包规范:DROP PACKAGE 包规范名 删除包体:DROP PACKAGE BODY 包体名 重新编译包头:ALTER PACKAGE 包名 COMPILE PACKAGE 重新编译包体:ALTER PACKAGE 包名 COMPILE PACKAGE BODY

2.3 注意事项

1. 包说明和包体名称必须一致

2. 包头和包体的编译顺序为先包头后包体
3. 包内定义的函数和过程不要使用CREATE OR REPLACE
4. 仅在包头成功编译后才能编辑包体
5. 函数和过程名称必须与包头一致

3、包的应用

3.1 包创建示例

以下是一个员工管理包的创建示例:

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_ENAME VARCHAR2, 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;    -- 其他存储过程和函数实现...END EMP_PK;

3.2 包调用示例

以下是如何调用包的示例:

-- 初始化包BEGIN    EMP_PK.INIT(200, 100);END; -- 查看员工列表CALL EMP_PK.LIST_EMP(); -- 新增员工CALL EMP_PK.INSERT_EMP(2021, '一二山人', 'YESR', 10000); -- 删除员工CALL EMP_PK.DELETE_EMP(2021); -- 修改工资CALL EMP_PK.CHANGE_EMP_SAL(7900, 150); -- 授权其他用户调用包GRANT EXECUTE ON EMP_PK TO SYS; -- 其他用户调用包CALL SCOTT.EMP_PK.INIT(400, 300);

4、包的进阶内容

4.1 包重载创建

包重载允许同一名称的包在不同版本中拥有不同的参数类型。以下是一个示例:

CREATE OR REPLACE PACKAGE EMP_OVERLOAD_PK IS    PROCEDURE INSERT_DEPT(P_DEPTNO DEPT.DEPTNO%TYPE, P_DNAME DEPT.DNAME%TYPE, P_LOC DEPT.LOC%TYPE);    PROCEDURE INSERT_DEPT(P_DEPTNO DEPT.DEPTNO%TYPE, P_DNAME DEPT.DNAME%TYPE);    FUNCTION GET_ADDSALARY(P_EMPNO EMP.EMPNO%TYPE) RETURN NUMBER;    FUNCTION GET_ADDSALARY(P_ENAME EMP.ENAME%TYPE) RETURN NUMBER;END EMP_OVERLOAD_PK;
CREATE OR REPLACE PACKAGE BODY EMP_OVERLOAD_PK IS    FUNCTION EXIST_DEPT(P_DEPTNO DEPT.DEPTNO%TYPE) RETURN NUMBER;    PROCEDURE INSERT_DEPT(P_DEPTNO DEPT.DEPTNO%TYPE, P_DNAME DEPT.DNAME%TYPE, P_LOC DEPT.LOC%TYPE) AS    BEGIN        IF EXIST_DEPT(P_DEPTNO) > 0 THEN            RAISE_APPLICATION_ERROR(-2021, '部门已存在');        END IF;        INSERT INTO DEPT (DEPTNO, DNAME, LOC) VALUES (P_DEPTNO, P_DNAME, P_LOC);        COMMIT;    END INSERT_DEPT; PROCEDURE INSERT_DEPT(P_DEPTNO DEPT.DEPTNO%TYPE, P_DNAME DEPT.DNAME%TYPE) ASBEGIN    IF EXIST_DEPT(P_DEPTNO) > 0 THEN        RAISE_APPLICATION_ERROR(-2022, '部门已存在');    END IF;    INSERT INTO DEPT (DEPTNO, DNAME, LOC) VALUES (P_DEPTNO, P_DNAME, '广州天河区');    COMMIT;END INSERT_DEPT;-- 其他存储过程和函数实现... END EMP_OVERLOAD_PK;

4.2 包重载调用

以下是如何调用包重载函数的示例:

-- 调用重载过程BEGIN    EMP_OVERLOAD_PK.INSERT_DEPT(50, '', '');END; -- 调用特定重载BEGINEMP_OVERLOAD_PK.INSERT_DEPT(60, '交付一部');END; -- 调用重载函数DECLAREV_SAL NUMBER(10, 2);BEGINV_SAL := EMP_OVERLOAD_PK.GET_ADDSALARY(7369);DBMS_OUTPUT.PUT_LINE('获取员工加薪:' || V_SAL);END; -- 调用另一个重载函数DECLAREV_SAL NUMBER(10, 2);BEGINV_SAL := EMP_OVERLOAD_PK.GET_ADDSALARY('SMITH');DBMS_OUTPUT.PUT_LINE('获取员工加薪:' || V_SAL);END;

转载地址:http://xodh.baihongyu.com/

你可能感兴趣的文章
Objective-C实现Adler32算法(附完整源码)
查看>>
Objective-C实现AES算法(附完整源码)
查看>>
Objective-C实现AffineCipher仿射密码算法(附完整源码)
查看>>
Objective-C实现aliquot sum等分求和算法(附完整源码)
查看>>
Objective-C实现all combinations所有组合算法(附完整源码)
查看>>
Objective-C实现all permutations所有排列算法(附完整源码)
查看>>
Objective-C实现all subsequences所有子序列算法(附完整源码)
查看>>
Objective-C实现AlphaNumericalSort字母数字排序算法(附完整源码)
查看>>
Objective-C实现alternate disjoint set不相交集算法(附完整源码)
查看>>
Objective-C实现alternative list arrange备选列表排列算法(附完整源码)
查看>>
Objective-C实现An Armstrong number阿姆斯特朗数算法(附完整源码)
查看>>
Objective-C实现anagrams字谜算法(附完整源码)
查看>>
Objective-C实现ApproximationMonteCarlo蒙特卡洛方法计算pi值算法 (附完整源码)
查看>>
Objective-C实现area under curve曲线下面积算法(附完整源码)
查看>>
Objective-C实现argmax函数功能(附完整源码)
查看>>
Objective-C实现arithmetic算术算法(附完整源码)
查看>>
Objective-C实现armstrong numbers阿姆斯壮数算法(附完整源码)
查看>>
Objective-C实现articulation-points(关键点)(割点)算法(附完整源码)
查看>>
Objective-C实现atoi函数功能(附完整源码)
查看>>
Objective-C实现average absolute deviation平均绝对偏差算法(附完整源码)
查看>>