包由两个分离的部分组成:包头(PACKAGE)和包体(PACKAGEBODY)。包头是包的说明部分,是对外的操作接口,对应用是可见的;包体是包的代码和实现部分,对应用来说是不可见的黑盒。
       出现在包头中的称为公有元素,出现在包体中的称为私有元素,出现在包体的过程(或函数)中的称为局部变量。

创建包头的简要语句如下:

CREATE [OR REPLACE] PACKAGE 包名
{IS|AS}
公有变量定义
公有类型定义
公有游标定义
公有异常定义
函数说明
过程说明
END;

创建包体的简要语法如下:

CREATE [OR REPLACE] PACKAGE BODY 包名
{IS|AS}
私有变量定义
私有类型定义
私有游标定义
私有异常定义
函数定义
过程定义
END;

其它操作:

删除包头:
DROP PACKAGE 包头名
删除包体:
DROP PACKAGE BODY 包体名
重新编译包头:
ALTER PACKAGE 包名 COMPILE PACKAGE
重新编译包体:
ALTER PACKAGE 包名 COMPILE PACKAGE BODY

案例:对学生表infos提供一个增删改查的包,infos表内容如下图所示:

包中的内容结构如下:

程序结构 类型 参数 说明
v_infos_count 公有变量   学生总总数量,number类型
p_init 公有过程

p_max number

p_min number

最大值,最小值
p_list_infos 公有过程   显示学生列表数据
p_add_infos 公有过程

p_stuid infos.stuid%type,
p_stuname infos.stuname%type,
p_gender infos.gender%type,
p_age infos.age%type,
p_seat infos.seat%type,
p_enrolldate infos.enrolldate%type,
p_stuaddress infos.stuaddress%type,
p_classno infos.classno%type

增加一条学生记录
p_delete_infos 公有过程 p_stuid infos.stuid%type 根据stuid删除一条学生记录
p_edit_infos_name 公有过程

p_stuid infos.stuid%type
p_stuname infos.stuname%type

根据stuid修改学生的姓名
v_msg 私有变量   show message
v_max_age 私有变量   max age ,number
v_min_age 私有变量   min age ,number
f_exist_infos 私有函数

p_stuid infos.stuid%type

判断学生是否存在,

return boolean

p_show_msg 私有过程   show msg

包SQL:

(1)创建包头
create or replace package pck_infos
as
--总数量
v_infos_count number;
--初始化操作
procedure p_init(p_max number, p_min number);
--显示学生列表数据
procedure p_list_infos;
--增加一条学生记录
procedure p_add_infos(
p_stuid infos.stuid%type,
p_stuname infos.stuname%type,
p_gender infos.gender%type,
p_age infos.age%type,
p_seat infos.seat%type,
p_enrolldate infos.enrolldate%type,
p_stuaddress infos.stuaddress%type,
p_classno infos.classno%type);
--删除一条学生记录
procedure p_delete_infos(p_stuid infos.stuid%type);
--根据stuid修改学生的姓名
procedure p_edit_infos_name(
p_stuid infos.stuid%type,
p_stuname infos.stuname%type);
end;
(2)创建包体
create or replace package body pck_infos
as
v_msg varchar2(100); --show message
v_max_age number; --max age
v_min_age number; --min age --判断学生是否存在
function f_exist_infos(p_stuid infos.stuid%type)
return boolean; --show msg
procedure p_show_msg; --初始化操作
procedure p_init(p_max number, p_min number)
as
begin
select count(stuid) into v_infos_count from infos;
v_max_age:=p_max;
v_min_age:=p_min;
v_msg:='init finished!';
p_show_msg;
end p_init; --显示信息
procedure p_show_msg
as
begin
dbms_output.put_line(v_msg);
end p_show_msg;
--判断学生是否存在
function f_exist_infos(p_stuid infos.stuid%type)
return boolean
as
v_num number;
begin
select count(stuid) into v_num from infos where stuid=p_stuid;
if v_num=1 then
return true;
else
return false;
end if;
end f_exist_infos; --显示学生列表数据
procedure p_list_infos
as
v_infos_record infos%rowtype;
cursor cur_infos is select * from infos;
begin
open cur_infos;
loop
fetch cur_infos into v_infos_record;
exit when cur_infos%notfound;
dbms_output.put_line('stuid:'||v_infos_record.stuid);
end loop;
close cur_infos;
end p_list_infos; --增加一条学生记录
procedure p_add_infos(
p_stuid infos.stuid%type,
p_stuname infos.stuname%type,
p_gender infos.gender%type,
p_age infos.age%type,
p_seat infos.seat%type,
p_enrolldate infos.enrolldate%type,
p_stuaddress infos.stuaddress%type,
p_classno infos.classno%type)
as
begin
if not f_exist_infos(p_stuid) then
insert into infos(stuid,stuname,gender,age,seat,enrolldate,stuaddress,classno)
values(p_stuid,p_stuname,p_gender,p_age,p_seat,p_enrolldate,p_stuaddress,p_classno);
commit;
v_infos_count:=v_infos_count+1;
else
v_msg:='already exist!';
end if;
end p_add_infos; --删除一条学生记录
procedure p_delete_infos(p_stuid infos.stuid%type)
as
begin
if f_exist_infos(p_stuid) then
delete from infos where stuid=p_stuid;
commit;
v_infos_count:=v_infos_count-1;
else
v_msg:='not exist infos!';
end if;
end p_delete_infos; --根据stuid修改学生的姓名
procedure p_edit_infos_name(
p_stuid infos.stuid%type,
p_stuname infos.stuname%type)
as
begin
if f_exist_infos(p_stuid) then
update infos set stuname=p_stuname where stuid=p_stuid;
commit;
else
v_msg:='not exists infos';
end if;
end p_edit_infos_name; end;

Oracle 中包的应用的更多相关文章

  1. Oracle 中包(Package)

    一.什么要使用包?        在一个大型项目中,可能有很多模块,而每个模块又有自己的过程.函数等.而这些过程.函数默认是放在一起的(如在PL/SQL中,过程默认都是放在一起 的,即Procedur ...

  2. Oracle中包的创建

    包是过程和函数的集合体,包包括创建包和创建包体,创建包的时候在可以定义过程和函数,包体中则具体实现过程和函数. eg: --创建包 create  or replace package mypac1 ...

  3. java实现调用ORACLE中的游标和包

    今天把oracle中的包和游标学习了下,不废话,网上的的有些代码是错误的,抄来抄去,就自己实践了下,做个记录.直接上图,上代码 通过plsql创建自己的的包,包分为包头和包体. 1.包头如下: CRE ...

  4. Oracle中如何导出存储过程、函数、包和触发器的定义语句?如何导出表的结构?如何导出索引的创建语句?

    Oracle中如何导出存储过程.函数.包和触发器的定义语句?如何导出表的结构?如何导出索引的创建语句? QQ群里有人问:如何导出一个用户下的存储过程?   麦苗答:方法有多种,可以使用DBMS_MET ...

  5. Oracle中DBMS_LOB包使用小结

    本文主要介绍oracle数据库中dbms_lob包的使用以及使用dbms_lob包来维护lob数据库类型的基本方法.随着社会的发展,在现代信息系统的开发中,需要存储的已不仅仅是简单的文字信息,同时还包 ...

  6. oracle中utl_file包读写文件操作实例学习

    在oracle中utl_file包提供了一些操作文本文件的函数和过程,学习了一下他的基本操作 1.创建directory,并给用户授权 复制代码 代码如下: --创建directory create ...

  7. oracle中的创建过程,函数,包

    一.创建存储过程 存储过程是在oracle中存取完成特定业务逻辑的代码块.存储过程是命名块,匿名块不存在数据库中,命名块会存储到数据库中,匿名块每次运行都需要提前编译,命名块一次存储,只会编译一次.命 ...

  8. Oracle中生成随机数的函数(转载)

    在Oracle中的DBMS_RANDOM程序包中封装了一些生成随机数和随机字符串的函数,其中常用的有以下两个: DBMS_RANDOM.VALUE函数 该函数用来产生一个随机数,有两种用法: 1. 产 ...

  9. oracle中函数和存储过程的区别和联系【转载竹沥半夏】

    oracle中函数和存储过程的区别和联系[转载竹沥半夏] 在oracle中,函数和存储过程是经常使用到的,他们的语法中有很多相似的地方,但也有自己的特点.刚学完函数和存储过程,下面来和大家分享一下自己 ...

随机推荐

  1. 抗忙,,建个MAVEN的私服仓库-NEXUS

    公司最近需求越来越上轨道,MAVEN的私服仓库-NEXUS构架起来哟.. 参考文档URL: http://www.linuxidc.com/Linux/2011-07/39578p3.htm http ...

  2. 这样就算会了PHP么?-9

    PHP关于COOKIE的应用 <?php if (!isset($_COOKIE["visittime"])) { setcookie("visittime&quo ...

  3. Keil的可重定位段

    对于一个大的文件,为了便于管理,一个好的办法时把一个大文件分为若干个小文件,每个小文件包含一部分相关的功能,这样功能将显得很整洁,而且移植到其它工程的时候也很方便,把文件copy过去即可. 对于汇编, ...

  4. Qt中文乱码问题(比较清楚,同一个二进制串被解释成不同的语言)

    文章来源:http://blog.csdn.net/brave_heart_lxl/article/details/7186631 以下是dbzhang关于qt中文乱码问题原因的阐述,觉得不错: 首先 ...

  5. smarty 内置函数if 等判断

    {if},{elseif},{else} Smarty的{if}条件判断和PHP的if 非常相似,只是增加了一些特性. 每个{if}必须有一个配对的{/if}. 也可以使用{else} 和 {else ...

  6. 2015第19周三小众app

    今天搜集下个人知道好玩的小众app: 1.开眼每日推荐5个小视频,世界那么大,一起来看看吧. 2.懒人周末周末去哪了?简洁美观 3.LOFTER 网易良心出品. 4.玩儿去 发现很多很多好玩的去处 5 ...

  7. jquery 的ready() 与window.onload()的区别

    做web开发时常用Jquery中$(document).ready()和JavaScript中的window.onload方法,两者都是要在页面加载完成以后加载的方法,但是这两者还是有很大区别的.最近 ...

  8. WPF 控件之ComboBox绑定[2]

    最近感觉新的方法Binding comboBox用起来很好用. 记录一下: <ComboBox Grid.Row=" x:Name="cboFamilyName" ...

  9. 转:DesiredCapabilities内容详解--Appium服务关键字

    ## Appium 服务关键字 <expand_table> |关键字|描述|实例| |----|-----------|-------| |`automationName`|你想使用的自 ...

  10. HTML5新增的一些属性和功能之八——web Worker

    Web Workers 为什么用web workers? 浏览器的原理中决定了页面打开只有一个主线程--UI渲染线程,如果线程中有耗时的程序(js)会阻塞线程,使得页面中其他的UI无法渲染,我们一般把 ...