程序包(学习笔记)

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

首先创建包,定义包规范

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 函数不允许读取包中的变量内容
时间: 2024-10-05 20:28:22

程序包(学习笔记)的相关文章

黑马程序员学习笔记_OC之给NSString增加分类

---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>.<a href="http://www.itheima.com"target="blank">.Net培训</a>.期待与您交流! ---------------------- 黑马程序员学习笔记_OC

黑马程序员学习笔记2014/7/5

观看视频:011_标识符_黑马程序员_Java基础视频.avi Java语言的基础组成 关键字.标识符.注释.常量和变量.运算符.语句.函数.数组.   关键字     标识符 1.在程序中自定义的一些名称 2.由26个英文字母大小写,数字,0-9符号 :_ $ 组成 3.定义合法标识符的规则: a.数字不可以开头 b.不可以使用关键字 4.Java中严格区分大小写 5.注意:在起名的时候尽量起一个有意义的名称       观看视频:012_常量_黑马程序员_Java基础视频 常量与变量 Jav

微信小程序,学习笔记(一)框架,视图层

微信小程序,学习笔记(一)框架,视图层 学习链接:http://www.w3cschool.cn/weixinapp/ 因为其实并非原创,但是并没有什么好的类别可选,所以修改成:"翻译"了. 熟悉 文档结构介绍 --- [D] pages --- [D] utils --- [F] app.js --- [F] app.json --- [F] app.wxss 全局变量.对象.方法 普通类型 对象 App 应用程序全局实例,在app.js中定义,每个程序只有一个实例,可以通过如下方式

马程序员学习笔记——红黑树解析四

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 本篇是将上面三篇的理论知识转化成代码,java实现 首先,看一下算法导论里的伪代码 一.左旋 The pseudocode for LEFT-ROTATE assumes that right[x] ≠ nil[T] and that the root's parent is nil[T].(伪代码的左旋方法中假设X的右孩子不为空) LEFT-

黑马程序员学习笔记-C指针小结

黑马程序员学习笔记-C指针 1. 指针简介: 指针是C语言中非常重要的数据类型,是C语言的精华 2. 指针变量定义: 格式:类名标识符 *指针变量名; 指针变量只能存储地址 指针就一个作用:能够根据一个地址值,访问对应的存储空间 指针变量p前面的int:指针变量只能指向int类型的数据 3.实例: 4. 注意点: 指针变量只能存储地址.指针变量未经初始化,不要拿来间接访问其他存储空间.指针变量的初始化可以int *p = &a;也可以拆分成两句:int *p; p =&a;.定义变量时的*

马程序员学习笔记——红黑树解析二

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 四.树中删除元素 1.先找到需要删除的元素. 2. 2.1如果被删元素没有子元素,那么直接用NIL节点代替他: 2.2如果被删元素只有一个子元素,那么直接用这个子元素代替他: 2.3如果被删元素有两个子元素,那么就用左子元素中的最大元素或者右子元素的最小元素代替他. 比如说原来要删除的元素是N,N有两个分支,其中P是N左分支中的最大元素,那么就

马程序员学习笔记——红黑树解析三

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 六.树的前序.中序.后序 前序遍历(根左右): 1.访问根节点 2.前序遍历左子树 3.前序遍历右子树 中序遍历(左根右): 1.中序遍历左子树 2.访问根节点 3.中序遍历右子树 后序遍历(左右根): 1.后序遍历左子树 2.后序遍历右子树 3.访问根节点 扩展:已知前序.中序遍历,求后序遍历? 例: 前序遍历: GDAFEMHZ 中序遍历:

黑马程序员学习笔记-OC之foundation框架

黑马程序员学习笔记-OC之foundation框架 1.简介:foundation框架是其它所有ios框架的基础,包含了很多常用类型,结构体.枚举.类等. 2. 结构体:NSRange表示范围的结构体. NSPoint/CGPoint表示坐标点的结构体 NSSize/CGSize表示宽高的结构体 NSRect/CGRect表示坐标点+宽高的结构体 3. 类字符串:NSString  字符串类 NSMUtableString  易变字符串类 NSArray         数组类 NSMUtabl

Android V7包学习笔记更新中.....

关于V4 V7 V13 VX包介绍转自这里 1, Android Support V4, V7, V13是什么? 本质上就是三个java library. 2, 为什么要有support库? 如果在低版本Android平台上开发一个应用程序,而应用程序又想使用高版本才拥有的功能,就需要使用Support库. 3, 三个Support 库的区别和作用是什么? Android Support v4 是最早(2011年4月份)实现的库.用在Android1.6 (API lever 4)或者更高版本之