程序包
概念:
程序包是一种数据库对象,它是对相关的pl/sql类型,子程序,游标,异常,变量和常量的封装。分为2部分。1是程序包规范2是程序包主题。
程序包规范:
声明包内数据类型,变量,常量,游标,子程序和异常等元素,这些元素为程序包的公有元素
语法
CREATE [OR REPLACE] PACKAGE package_name
{IS | AS}
[公有数据类型定义[公有数据类型定义]。。。。。] ---无需程序包主体实现
[共有游标的声明 [公有游标的声明]。。。。。。] - --需要程序包主体具体实现
[公有子程序的声明[公有子程序的声明]。。。。。] ---需要程序包主体具体实现
END [ package_name ];
(在程序包规范内声明的项可以在程序包之外使用,所以称为公用对象)
---------------------示例一创建程序包规范------------------------------
CREATE OR REPLACE PACKAGE pack_me IS PROCEDURE emp_proc(num NUMBER ); --声明存储过程 FUNCTION emp_fun(empno NUMBER) RETURN VARCHAR2; --声明函数 END pack_me;
程序包的主体:
包定义部分的具体实现,它定义了包定义部分所声明的游标和子程序,在程序包主题中还可以声明包的私有元素。
语法:
CREATE [OR REPLACE ] PACKAGE BODY package_name
{IS | AS}
[私有数据类型定义[私有数据类型定义]。。。。]
[私有变量和常量,异常的声明[私有变量和常量,异常的声明]。。。]
[私有的子程序和游标声明和定义[私有的子程序和游标声明和定义]。。。。]
[共有的游标和子程序的定义[共有的游标和子程序的定义]。。。]
BEGIN
执行部分(初始化部分) ----可用于初始化程序包中的变量,不能调用程序包也不能传参给程序包,只执行一次。
END package_name;
---------------------示例二创建程序包主体------------------------------
CREATE OR REPLACE BODY pack_me AS--实现规范部分声明的存储过程 PROCEDURE emp_prco(NUM NUMBER) IS e_mail VARCHAR2(50); BEGIN SELECT t.e_mail INTO e_mail FROM employees t WHERE t.id=NUM; dbms_output.put_line(e_mail); END emp_prco; --实现规范部分声明的函数 FUNCTION emp_fun(empno NUMBER) RETURN VARCHAR2 IS emp_name VARCHAR2(20); BEGIN SELECT t.name INTO emp_name FROM employees t WHERE t.id=empno; RETURN em_name; END emp_fun;--关闭程序包主体部分 END pack_me;
调用程序包:
语法:程序包名.[子程序名|游标名|变量名。。等]
---------------------示例三调用程序包------------------------------
DECLARE v_name VARCHAR2(20); v_num NUMBER; BEGIN v_num :=# --接受用户输入数字编号 pack_me.emp_proc(v_num); v_name :=pack_me.emp_fun(v_num); --变量接受函数返回值 dbms_output.put_line(v_name); END;
其他程序包的操作
查询包
--查询user_objects数据字典确认包规范及包体 SELECT object_type,object_name,status FROM User_Objects WHERE object_type IN('PACKAGE','PACKAGE BODY');
--查询包的内容 SELECT * FROM user_source WHERE TYPE='PACKAGE' AND NAME='GETEMP_PKG';
删除包
删除包规范
DROP PACKAGE 包名称
删除包体
DROP PACKAGE BODY包名称
删除包规范里会对其对应的包体一起删除
包的重新编译
ALTER PACKAGE 包名称 COMPILE PACKAGE; --示例 ALTER PACKAGE GETEMP_PKG COMPILE PACKAGE;
包的纯度级别
语法:
PRAGMA restrict_references(函数名,WNDS[,WNPS][,RNDS][,RUPS])
NO | 纯度等级 | 说明 |
1 | WNDS | 函数不能悠数据库表数据(无法使用DML更新) |
2 | RNDS | 函数不能读数据库表(无法使用SELECT查询) |
3 | WNPS | 函数不允许悠包中的变量内容 |
4 | RNPS | 函数不允许读取包中的变量内容 |
来源:https://www.cnblogs.com/hjiongjiong/p/4231989.html