Fork me on GitHub

程序包(学习笔记)

示例一、根据输入的部门编号找到这个部门的所有员工

首先创建包,定义包规范

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 函数不允许读取包中的变量内容
posted @ 2015-01-11 18:21  森林森  阅读(424)  评论(0编辑  收藏  举报