开发包

1建立包
 1) 建立包规范: 用于定义包的公共组建,包括常量,变量,游标,过程和函数等
 create or replace package emp_package is
  g_deptno number(3):=30;
  procedure add_employee(eno number,name varchar2,salary number dno number default g_deptno);
  procedure fire_empoyee(eno number);
  function get_sal(eno number) return number;
 end emp_package;
  2) 建立包体
   用于实现包规范所定义的过程和函数。在包体中也可以单独定义私有组件,包括变量,常量,过程和函数等。但在包体中所定义的组件只能在包内使用,而不能由其他子程序引用。
   create or replace package body emp_package is
    function validate_deptno(v_deptno number)
      return boolean;
    is
      v_temp int;
    begin
      select 1 into v_temp from dept where deptno=v_deptno;
      return true;
    exception
      when no_data_found then
       return false;
    end;
    procedure add_employee(eno number,name varchar2,salary number,dno number default g_deptno)
    is
    begin
      if validate_deptno(dno) then
        insert into emp(empno,ename,sal,deptno)
         values(eno,name,salary,dno);
      esle
        raise_application_error(-20011,'部门不存在');
      end if;
    exception
      when dup_val_on_index then
        raise_application_error(-20011,'该雇员已存在')
    end;
    procedure fire_employee(eno number) is
    begin
      select from emp where empno=eno;
      if sql%notfound then
         raise application_error(-20012,'');
      end if;
    end;
   function get_sal(eno number) return number
   is
     v_sal emp.sal%type;
   begin
     select sal into v_sal from emp where empno=eno;
     return v_sal;
   exception
     when no_data_found then
       raise_application_error(-200012,'');
   end;
  end emp_package;
  3) 调用包组建
    -- 在同一个包内调用组建 不需要加包名前缀,直接调用
  create or replace paclage body emp_package is
    procedure add_employee(eno number,name varchar2,salary number,dno number default g_deptno)
    is
    begin
      validate_deptno(dno) then
    exception
    end;
   -- 调用包公用变量
   exec emp_package.g_deptno:=20
   -- 调用公用过程
   exec emp_package.add_employee(111,'mary,2000');
   -- 调用远程数据库包的公用组件
   exec emp_paclage.add_employee@orasrv(1116,'scott',1200);
   4) 查看包源代码
   select text from user_source where name='emp_package' and type='package';
   5) 删除包
   drop packagee emp_package;
2 使用包重载
  指多个具有相同名字的子程序,在调用的时候使用不同的参数传递。
  1) 建立包规范
   同名过程和函数必须具有不同的输入参数,但同名函数返回值的类型数据必须相同
    create or replace package overload is
    function get_sal(eno number) return number;
    function get_sal(name varchar2) return number;
    procedure fire_employee(eno number);
    procedure fire_employee(name varchar2);
   2) 建立包体
    。。。
3) 使用包构造过程
 初始化全局变量
 1 建立包规范
   create or replace packiage emp_package
   is
   minsal number(6,2);
   maxsal number(6,2);
   procedure upd_sal(eno number,salary number);
   procedure upd_sal(name varhcar2,salary number);
   end;-- 定义了两全局变量和三个公用过程
   2 建立包体
    create or replace package body emp_package is
      procedure add_employee(cno number,name varchar2,salary number,dno number)
      is
      begin
        if salary between minsal and maxsal then
          insert into emp(empno,ename,sal,deptno)
         ........
    -- 构造过程,位于子程序尾部,已begin 开始已end 结束
     begin
       select min(sal),max(sal) into minsal,maxsal from emp;
     end;
      end;
3 调用包公用组建
   在同一次会话中第一次调用包的公用组建时,会自动执行其它构造函数,而将来调用其他组建时则不会再调用其构造过程。
4 使用纯度级别
 1 家里包规范
  create or replcace package purity is
  minsal number(6,2);
  maxsal number(6,2);
  function max_sal return number;
  function min_sal return number;
  pragma restrict_references(max_sal,wnps);--wnps 不能修改包的变量(不能给包的变量赋值)                                            --wnds 不能执行dml
  pragma restrict_references(min_sal,wnps);--rnps 用于限制函数不能读取包变量
  end;

posted on 2006-10-11 14:46 康文 阅读(352) 评论(0)  编辑  收藏 所属分类: 数据库


只有注册用户登录后才能发表评论。


网站导航:
 
<2006年10月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

导航

统计

常用链接

留言簿(1)

随笔分类

随笔档案

文章档案

搜索

最新评论

阅读排行榜

评论排行榜