程序包(学习笔记)
示例一、根据输入的部门编号找到这个部门的所有员工
首先创建包,定义包规范
create or replace package getemp_pkg is
FUNCTION getemp_fun(p_dno dept.deptno%type) RETURN SYS_REFCURSOR; --返回弱类型游标
end getemp_pkg;
执行后自动生成包的主体
定义包的主体(实现体)
create or replace package body getemp_pkg
AS
FUNCTION getemp_fun(p_dno dept.deptno%TYPE)
RETURN SYS_REFCURSOR --返回弱类型游标
AS
cur_emp SYS_REFCURSOR;
begin
OPEN cur_emp FOR SELECT * FROM emp WHERE deptno=p_dno; --打开游标
RETURN cur_emp; --返回游标
END getemp_fun;
end getemp_pkg;
调用包
DECLARE
V_EMP EMP%ROWTYPE; --定义变量来接收游标的内容
CUR_EMP SYS_REFCURSOR; --定义游标来接收返回游标
V_DNO DEPT.DEPTNO%TYPE; --定义部门编号,转入参数
BEGIN
CUR_EMP := GETEMP_PKG.GETEMP_FUN(&V_DNO);
LOOP
FETCH CUR_EMP --提取游标
INTO V_EMP;
EXIT WHEN CUR_EMP%NOTFOUND; --退出条件
DBMS_OUTPUT.PUT_LINE(CUR_EMP%ROWCOUNT || ' 员工编号:' || V_EMP.EMPNO ||
' 姓名:' || V_EMP.ENAME);
END LOOP;
CLOSE cur_emp; --关闭游标
END;
示例二、包中有过程和函数
程序包规范
create or replace package pack_me is
PROCEDURE emp_proc(num NUMBER);
FUNCTION emp_fun(eno NUMBER) RETURN VARCHAR2;
end pack_me;
程序包主体
create or replace package body pack_me is
PROCEDURE emp_proc(num NUMBER) IS
v_name VARCHAR2(50);
BEGIN
SELECT ename INTO v_name FROM emp WHERE empno=num;
dbms_output.put_line('员工编号:'||num||' 的姓名:'||v_name);
END emp_proc;
FUNCTION emp_fun(eno NUMBER) RETURN VARCHAR2
AS
v_job varchar2(50);
BEGIN
SELECT job INTO v_job FROM emp WHERE empno=eno;
RETURN v_job;
--dbms_output.put_line('员工编号:'||empno||' 的职位:'||v_job);
END emp_fun;
end pack_me;
执行
--程序包
DECLARE
v_empno emp.empno%TYPE:=&empno;
v_job Varchar2(50);
BEGIN
pack_me.emp_proc(v_empno);
v_job:=pack_me.emp_fun(v_empno);
dbms_output.put_line('员工编号:'||v_empno||' 的职位:'||v_job);
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 | 函数不允许读取包中的变量内容 |