Oracle 中包的应用

包由两个分离的部分组成:包头(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;
时间: 2024-10-27 04:04:42

Oracle 中包的应用的相关文章

Oracle 中包(Package)

一.什么要使用包?        在一个大型项目中,可能有很多模块,而每个模块又有自己的过程.函数等.而这些过程.函数默认是放在一起的(如在PL/SQL中,过程默认都是放在一起 的,即Procedures中),这些非常不方便查询和维护,甚至会发生误删除的事件. PL/SQL为了满足程序模块化的需要,引入了包的构造.通过使用包就可以分类管理过程和函数等. (1)包是一种数据库对象,相当于一个容器.将逻辑上相关的过程.函数.变量.常量和游标组合成一个更大的单位.用户可以从其他 PL/SQL 块中对其

Oracle中包的创建

包是过程和函数的集合体,包包括创建包和创建包体,创建包的时候在可以定义过程和函数,包体中则具体实现过程和函数. eg: --创建包 create  or replace package mypac1 is procedure mypro1(p_ename varchar2,p_sal number); function myfun1(f_ename varxhar2) return number; end; --创建包体 create package body mypac1 is procedu

Oracle中的包的使用

Oracle中包的使用 使用程序包主要是为了实现程序的模块化,程序包可以将相关的存储过程,函数,变量,常量和游标等PL/SQL程序组合在一起,通过这种方式可以构供程序人员重用的代码库.另外,当首次调用程序包中的存储过程或函数等元素是,Oracle会将整个程序包调入内存,在下次调用程序包中的元素时,Oracle就可以之际从内存中读取,从而提程序的运行效率. 程序包主要包括两个部分:包规范和包体.其中, 包规范用于列出包中可用的存储过程.函数和游标等元素条目(不含这些元素的实际代码),这些条目属于公

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

今天把oracle中的包和游标学习了下,不废话,网上的的有些代码是错误的,抄来抄去,就自己实践了下,做个记录.直接上图,上代码 通过plsql创建自己的的包,包分为包头和包体. 1.包头如下: 1 CREATE OR REPLACE PACKAGE JAVALINKTEST 2 IS 3 TYPE CURSOR_TYPE IS REF CURSOR; --定义游标 4 PROCEDURE TEST_CURSOR(INPUT STRING, CURSOR_BACK OUT CURSOR_TYPE)

Oracle中DBMS_LOB包使用小结

本文主要介绍oracle数据库中dbms_lob包的使用以及使用dbms_lob包来维护lob数据库类型的基本方法.随着社会的发展,在现代信息系统的开发中,需要存储的已不仅仅是简单的文字信息,同时还包括一些图片和音像资料或者是超长的文本.比如开发一套旅游信息系统,每一个景点都有丰富的图片.音像资料和大量的文字介绍.这就要求后台数据库要有存储这些数据的能力.ORACLE公司在其Oracle8i中通过提供LOB字段实现了该功能. 在ORACLE数据库中,LOB大对象类型是用来存储大量的二进制和文本数

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

在oracle中utl_file包提供了一些操作文本文件的函数和过程,学习了一下他的基本操作 1.创建directory,并给用户授权 复制代码 代码如下: --创建directory create or replace directory TESTFILE as '/home/oracle/zxx/test'; --给用户授权 grant read, write on directory TESTFILE to zxx; 详细介绍 http://download.oracle.com/docs

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

一.创建存储过程 存储过程是在oracle中存取完成特定业务逻辑的代码块.存储过程是命名块,匿名块不存在数据库中,命名块会存储到数据库中,匿名块每次运行都需要提前编译,命名块一次存储,只会编译一次.命名块可以多次使用. 创建存储过程的语法: create [or replace] procedure 存储过程的名称(参数名[in/out/inout] 参数类型,参数名...)] is/as 变量声明部分 begin 业务逻辑处理部分 exception 异常处理部分 end; 注意: 1.存储过

oracle中的job

oracle知识点-job oracle中的job类似于Linux中的crontab的作用,用于定时执行某些操作 相关视图:dba_jobs,user_jobs,all_jobs,dba_jobs_running 相关参数:job_queue_processes 相关包:dbms_job 有关dba_jobs.dba_jobs_running 字段的解释: dba_jobs 描述数据库中所有的job desc dba_jobs 有关interval参数的值 dba_jobs_running  列

Oracle中PL/SQL简介、基本语法以及数据类型

Oracle中PL/SQL简介.基本语法以及数据类型 一.PL/SQL简介. Oracle PL/SQL语言(Procedural Language/SQL)是结合了结构化查询和Oracle自身过程控制为一体的强大语言,PL/SQL不但支持更多的数据类型,拥有自身的变量申明,赋值语句,而且还有条件,循环等流程控制语句.过程控制结构与SQL数据处理能力无缝的结合形成了强大的编程语言,可以创建过程和函数以及程序包. PL/SQL是一种块结构的语言,它将一组语句放在一个块中,一次性的发送给服务器,由服