--包
--概念
对功能或业务相似的存储过程、函数、类型等的一个封装,对外部提供统一调用的接口。
具有封装性、安全性等特点。
--包分为
包头:声明部分,是对公有对象的声明。
包体:实现部分,是对声明部分声明的对象的具体实现。
--语法
--创建包头
CREATE [OR REPLACE] PACKAGE 包名
IS
--类型的定义
--变量/常量的声明
--公有存储过程的声明
PROCEDURE 储存过程名(参数);
--公有函数的声明
FUNCTION 函数名(参数) RETURN 返回值类型;
END;
--创建包体
CREATE OR REPLACE PACKAGE BODY 包名
IS
--私有对象的声明
--私有类型
--私有变量/常量
--私有的存储过程
--私有的函数
--公有对象的实现
--公有存储过程的实现
PROCEDURE 储存过程名(参数)
IS
...
BEGIN
...
END;
--公有函数的实现
FUNCTION 函数名(参数) RETURN 返回值类型
IS
...
BEGIN
...
RETURN 语句;
END;
END;
--包的调用
包名.对象名
--公有对象
可以通过包名.对象名直接访问的属性都是共有对象(所有在包头中声明的内容都属于公有对象)
--私有对象
只能在包内部使用,不能通过包名调用(在包体中出现,没有在包头声明的对象都属于私有对象)
私有对象一般在公有对象前面。
--示例1
--创建包头
CREATE OR REPLACE PACKAGE P_ETL
IS
--定义一个索引表类型
TYPE CTYPE IS TABLE OF VARCHAR2(50) INDEX BY PLS_INTEGER;
--声明一个变量
V_S VARCHAR2(50);
--定义一个常量
PI CONSTANT NUMBER(6,5):=3.1415;
--声明一个存储过程,打印九九乘法表
PROCEDURE SP_99;
--声明一个函数,计算一个数的阶乘
FUNCTION F_JC(I_N NUMBER) RETURN NUMBER;
END;
--创建包体(包的实现)
CREATE OR REPLACE PACKAGE BODY P_ETL
IS
--声明一个私有对象
V_STR VARCHAR2(50):='---九九乘法表--';
--私有的存储过程
PROCEDURE SP_PRINT
IS
BEGIN
DBMS_OUTPUT.PUT_LINE(V_STR);
END;
--实现公有的存储过程
PROCEDURE SP_99
IS
BEGIN
--调用私有的存储过程
SP_PRINT();
FOR V_I IN 1..9 LOOP
FOR V_J IN 1..V_I LOOP
DBMS_OUTPUT.PUT(V_J||'*'||V_I||'='||(V_J*V_I));
IF V_J*V_I<10 THEN
DBMS_OUTPUT.PUT(' ');
ELSE
DBMS_OUTPUT.PUT(' ');
END IF;
END LOOP;
DBMS_OUTPUT.NEW_LINE();
END LOOP;
END SP_99;
--实现公有的函数
FUNCTION F_JC(I_N NUMBER) RETURN NUMBER
IS
BEGIN
IF I_N=1 THEN
RETURN 1;
ELSE
RETURN I_N*F_JC(I_N-1);
END IF;
END F_JC;
END P_ETL;
--调用P_ETL测试
BEGIN
P_ETL.V_S:='公有变量赋值';
P_ETL.SP_99();
DBMS_OUTPUT.PUT_LINE(P_ETL.V_S);
DBMS_OUTPUT.PUT_LINE(P_ETL.F_JC(6));
END;
CALL P_ETL.SP_99();
SELECT P_ETL.F_JC(6) FROM DUAL;