文档章节

Oracle 中包(Package)

小强斋太
 小强斋太
发布于 2016/11/09 20:06
字数 1384
阅读 0
收藏 0

一、什么要使用包?

       在一个大型项目中,可能有很多模块,而每个模块又有自己的过程、函数等。而这些过程、函数默认是放在一起的(如在PL/SQL中,过程默认都是放在一起 的,即Procedures中),这些非常不方便查询和维护,甚至会发生误删除的事件。

PL/SQL为了满足程序模块化的需要,引入了包的构造。通过使用包就可以分类管理过程和函数等。

(1)包是一种数据库对象,相当于一个容器。将逻辑上相关的过程、函数、变量、常量和游标组合成一个更大的单位。用户可以从其他 PL/SQL 块中对其进行引用

(2)包类似于C++和JAVA语言中的类,其中变量相当于类中的成员变量,过程和函数相当于类方法。把相关的模块归类成为包,可使开发人员利用面向对象的方法进行开发,具有面向对象程序设计语言的特点,

(4)PL/SQL的包具有信息隐蔽性(information hiding),仅在算法和数据结构设计有关层可见。可将过程说明和过程体组成一个程序单位。也可将过程说明与它的过程体分开。也可在包中定义过程,而该过程在包说明中没有定义过程说明,这样定义的过程仅在包内使用。

(5)在PL/SQL程序设计中,使用包不仅可以使程序设计模块化,对外隐藏包内所使用的信息(通过使用私用变量),而写可以提高程序的执行效率。因为,当程序首次调用包内函数或过程时,ORACLE将整个包调入内存,当再次访问包内元素时,ORACLE直接从内存中读取,而不需要进行磁盘I/O操作,从而使程序执行效率得到提高。

二、包结构

一个包由两个分开的部分组成:包规范包体

2.1包定义(PACKAGE)

(1) 包定义(PACKAGE):包定义部分是为应用程序的接口,声明包内数据类型、变量、常量、游标、子程序和异常错误处理等元素,这些元素为包的公有元素。

CREATE [OR REPLACE] PACKAGE package_name
 
  {IS | AS}

   [公有数据类型定义]

   [公有游标声明]

   [公有变量、常量声明]

   [公有子程序声明]

END   [package_name];

2.2包主体(PACKAGE BODY)

包主体(PACKAGE BODY):包主体则是包定义部分的具体实现,它定义了包定义部分所声明的游标和子程序,在包主体中还可以声明包的私有元素。如果在包主体中的游标或子程序并没有在包头中定义,那么这个游标或子程序是私有的。

CREATE [OR REPLACE] PACKAGE BODY package_name

{IS | AS}

                   [私有数据类型定义]

                   [私有变量、常量声明]

                   [私有子程序声明和定义]

                   [公有子程序定义]

BEGIN

                   执行部分(初始化部分)

END [package_name];

与类相同,包中的程序元素也分为公用元素和私用元素两种,这两种元素的区别是他们允许访问的程序范围不同,即它们的作用域不同。公用元素不仅可以被包中的函数、过程所调用,也可以被包外的PL/SQL程序访问,而私有元素只能被包内的函数和过程序所访问。

包定义和包主体分开编译,并作为两部分分开的对象存放在数据库字典中。包定义一定要在包主体前面编译,包主体可以没有,但包定义一定要有) 包的名称和包体的名称要保持一致

三、包举例

定义包规范

CREATE OR REPLACE 
package p_stu
as
    --定义结构体
    type re_stu is record(
        rname student.name%type,
        rage  student.age%type
    );
    --定义游标
    type c_stu is ref cursor;
    --定义函数
    function numAdd(num1 number,num2 number)return number;
    --定义过程
    procedure GetStuList(cid in varchar2,c_st out c_stu); 
end;

说明 type c_stu is ref cursor;

type c_stu:定义类型变量

is ref cursor:相当于数据类型,不过是引用游标的数据类型clip_image002

这种变量通常用于存储过程和函数返回结果集时使用,因为PL/SQL不允许存储过程或函数直接返回结果集,但可以返回类型变量,于是引用游标的类型变量作为输出参数或返回值就应运而生了。

定义包体:

CREATE OR REPLACE 
package body p_stu
as
    --游标和结构体,包规范中已声明,包体中不用再声明,直接使用。
    
    --实现方法   
    function numAdd(num1 number,num2 number)return number
    as
        num number;
    begin
        num:=num1+num2;
        return num;
    end;
    
    --实现过程
    procedure GetStuList(cid varchar2,c_st out c_stu)
    as
        r_stu re_stu; --直接使用包规范中的结构
    begin
        open c_st for select name,age from student where classid=cid;
       -- 如果已经在过程中遍历了游标,在使用这个过程的块中,将没有值。
       -- loop
       --     fetch c_st into r_stu;  
       --     exit when c_st%notfound;
       --     dbms_output.put_line('姓名='||r_stu.rname);
       -- end loop;
    end;
end;

调用包

declare
    c_stu p_stu.c_stu;   --定义包中游标变量
    r_stu p_stu.re_stu;  --定义包中结构体变量
    num number;
begin
    --使用及遍历包中过程返回的结果集
    p_stu.GetStuList('5',c_stu);
    loop
        fetch c_stu into r_stu;
        exit when c_stu%notfound;
        dbms_output.put_line('姓名='||r_stu.rname);
    end loop;
    
    --使用包中的方法
    select p_stu.numAdd(5,6) into num from dual;
    dbms_output.put_line('Num='||num);
end;

参考

Oracle 包(Package)

第七章 程序包的创建和应用

本文转载自:http://www.cnblogs.com/xqzt/p/4875891.html

共有 人打赏支持
小强斋太
粉丝 0
博文 181
码字总数 0
作品 0
广州
私信 提问
linux服务器上 oracle instantclient 客户端的安装和配置

linux服务器上 oracle instantclient 客户端的安装和配置 2013年03月07日 18:03:16 阅读数:3437 Oracle Instant client 是oracle提供的简便客户端, 支持多种平台. 从oracle网站下载。 下载地...

rootliu
05/16
0
0
Oracle之PL/SQL学习笔记之包

Oracle之PL/SQL学习笔记之包 1. 认识包(package) 1.1 什么是包 包是一组相关过程、函数、变量、常量和游标等PL/SQL程序设计元素的组合,它具有面向对象程序设计语言的特点,是对这些PL/SQL ...

残风vs逝梦
2014/09/06
0
0
【Oracle_Package】Oracle的Package的作用及用法 【20140612】

Oracle的Package的作用 简化应用设计、提高应用性能、实现信息隐藏、子程序重载。 1、Oracle的Package除 了把存储过程放到一堆儿以外还有没有其他的作用(好处)? 你不觉得把存储过程分门别...

shihuafu
2014/06/12
0
0
如何在PLSQL中调试PACKAGE包中的FUNCTION函数

如何在PLSQL中调试PACKAGE包中的FUNCTION函数 Oracle中的packages包是一组包含procedures存储过程、functions函数和游标等元素的组合。相比Sybase数据库的SQL Advantage工具,Oracle数据库的...

yl497103815
07/02
0
0
Oracle专题15之包

1、包的概述 a、什么是包? 包是一组相关过程、函数、变量、常量和游标等PL/SQL程序设计元素的组合。 b、包的特点? 它具有面向对象程序设计语言的特点,是对PL/SQL程序设计元素(过程、函数...

极客微信条
2017/12/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

/etc/profile和/etc/profile.d/的区别

/etc/profile 是文件, /etc/profile.d/ 是目录,用在设置环境变量方面,/etc/profile 文件和 /etc/profile.d/ 目录实现效果是一样的,可根据自己对环境变量配置的需求场景,选择一种最好的方...

calmsnow
14分钟前
2
0
支付系统设计

概述 支付系统是连接消费者、商家(或平台)和金融机构的桥梁,管理支付数据,调用第三方支付平台接口,记录支付信息(对应订单号,支付金额等),金额对账等功能,根据不同公司对于支付业务...

小致dad
15分钟前
2
0
解决Docker Image镜像无法删除问题的方法

前言 Docker是Docker.Inc公司开源的一个基于轻量级虚拟化技术的容器引擎项目,整个项目基于Go语言开发,并遵从Apache 2.0协议。通过分层镜像标准化和内核虚拟化技术,Docker使得应用开发者和运...

临江仙卜算子
19分钟前
1
0
centos 7 redis_install.sh

#!/bin/bashprintf "============开始安装redis\n"printf "============输入redis下载url,按enter默认下载5.0.3版本\n"download_url='';while truedoread download_url...

偶遇一只小仙女
22分钟前
1
0
分布式消息通信ActiveMQ原理-消费消息策略-笔记

消费端消费消息的原理 我们通过上一节课的讲解,知道有两种方法可以接收消息, 一种是使用同步阻塞的MessageConsumer#receive方法。 另一种是使用消息监听器MessageListener。 这里需要注意的...

Java搬砖工程师
25分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部