Chinaunix首页 | 论坛 | 博客
  • 博客访问: 8701
  • 博文数量: 4
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 50
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-31 16:57
文章分类
文章存档

2010年(1)

2009年(3)

我的朋友
最近访客

分类: Oracle

2010-08-14 11:57:34

Oracle的包真的是个很不错的东西;

PL/SQL为了满足程序模块化的需要,除了块(block)和子程序结构外,还引入了包的构造。

1)包是一种数据库对象,将逻辑上相关的PL/SQL类型、对象和子程序组合成一个更大的单位,是一组相关过程、函数、变量、常量和游标等PL/SQL程序设计元素的组合,它具有面向对象程序设计语言的特点,是对这些PL/SQL 程序设计元素的封装。

2)包类似于C++JAVA语言中的类,其中变量相当于类中的成员变量,过程和函数相当于类方法。把相关的模块归类成为包,可使开发人员利用面向对象的方法进行存储过程的开发,从而提高系统性能。

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

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

5)在PL/SQL程序设计中,使用包不仅可以使程序设计模块化,对外隐藏包内所使用的信息(通过使用私用变量),而写可以提高程序的执行效率。因为,当程序首次调用包内函数或过程时,ORACLE将整个包调入内存,当再次访问包内元素时,ORACLE直接从内存中读取,而不需要进行磁盘I/O操作,从而使程序执行效率得到提高。如果ORACLE具有Procedure选件,包可以编译、存贮在ORACLE数据库中,其内容可为许多应用共享。
 
    也就是说,包与过程和函数的一个明显区别是,包仅能存储在非本地的数据库中。除了允许相关的对象组和为组之外,包与依赖性较强的存储子程序相比其所受的限制较少。除此之外,包的效率比较高。
 
    从本质上来说,包是一个命名的声明部分。任何可以出现的块中的语句都可以在包中使用。包括过程、函数、游标、类型和变量。这些内容放到包中的好处是,用户可以从其它的PL/SQL块中对其进行引用,包为PL/SQL提供了全程变量。
 
包的定义分为包头和包体定义。我用一个例子来说明:
包头:
 

create or replace package TestPackage is
  type mycursor is ref cursor;
  procedure GetRecords(ret_cursor out mycursor);
  procedure del_document(docId in number,userId in number,ipAddress in varchar);
end TestPackage;

包体:

create or replace package body TestPackage is
--测试包

  procedure GetRecords(ret_cursor out mycursor) as
     begin
            open ret_cursor for select * from tb_document;
     end GetRecords;
   --删除设计

  procedure del_document(docId in number,userId in number,ipAddress in varchar) as
  v_userName tb_userinfo.name%TYPE;
  v_oilArea tb_document.oilarea%TYPE;
  v_oilWell tb_document.oilwell%TYPE;
  v_workTarget tb_document.worktarget%TYPE;
  v_docTypeName tb_documenttype.name%TYPE;
    begin
    select name into v_userName from tb_userinfo where id = userId;
    select a.oilarea,a.oilwell,a.worktarget,b.name into v_oilArea,v_oilWell,v_workTarget,v_docTypeName from tb_document a,tb_documenttype b where a.doctypeid = b.id and a.id = docId;
       --删除关联表记录

        begin
            delete from tb_visitedhistory where DOCUMENTID = docId;
            delete from tb_documentsignature where DOCUMENTID = docId;
            delete from tb_approved where DOCUMENT_ID = docId;
            delete from tb_userdocument where DOCUMENTID = docId;
            delete from tb_documentassociation where doc_id = docId or assoc_id = docId;
            delete from tb_document where id = docId;
        end;
        --写入日志文件

        begin
        insert into tb_syslog values(hibernate_sequence.nextval,sysdate,v_userName,ipAddress,v_userName||'删除'||v_oilArea||v_oilWell||v_workTarget||v_docTypeName,1);
        end;
    end;
  
  end TestPackage;


阅读(539) | 评论(0) | 转发(0) |
0

上一篇:IBM---FileNet---javaAPI实现封闭报销流程(二)

下一篇:没有了

给主人留下些什么吧!~~