oracle 包 (package)

/* oracle 包 (package)*/
/*
  包用于逻辑组合相关的pl/sql类型,项和子程序,由包规范 和 包体组成
  实际上包是用于与应用程序的接口。
  《1》包的例子
    1.创建包类型
   create or replace package emp_package is
    g_deptno number(3) := 30;
    procdure add_employee(eno,number,name varchar2,
                salary number,dno number default g_deptno);
    function get_sal(eno number) return number;   
   
    end emp_package;
    /        
   
    2.实现包体emp_package
      create or replace package body emp_package
       is
        -- validate_deptno 为包体私有方法,可以内部被直接调用
       function validate_deptno(v_deptno) return boolean
         is
          v_temp int;
        begin
           select 1 into v_temp from dept t where t.deptno=v_deptno;
            return true;
           exception
              when not_data_found then
                 return false;
            end;
        end;
       --实现包类型 存储过程add_employee
       procdure add_employee(eno,number,name varchar2,salary number,dno 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);
          else
             raise_application_error(-20201,'不存在该部门!');
          end if;
         
          exception
            when dup_val_on_index then
              raise_application_error(-20201,'该雇员已经存在!');
           end;
         end;
       -- 实现包类型 get_sal 方法
       function get_sal(eno number) return number
        is
        begin
           ...............
        end;
      
       end; 
       
       -- 可以在命令行 调用公共存储过程 :exec emp_package.add_employee(111,'tom',9999,10);
       -- 在命令行调用 包公共函数   ;     var sal number;
                                          exec sal :=emp_package.get_sal(10);
 
 
  《2》使用包重装
        重载是指多个具有多个相同名称的子程序(使用不同的参数传递数据);
        1.在重载函数时同名函数返回的数据类型必须完全相同。
         eg
         create or replace package emp_overload is
                max_sal number(8,2);
                min_sal number(8,2);
               function get_sal(eno number) return number;
               function get_sal(name varchar2) return numnber;
           end;
        
        
  《3》使用包构造过程
        在包中定义了全局变量后,有些会话中,可能需要初始化全局变量,在一个会话中,第一次调用公共组件时,会自动执行其存储过程,
              并且构造过程在同一会话中只能被执行一次
              包的构造过程被放在包体的最后。并且没有任何名称,只是一个块
              create or replace package emp_overload is
               function get_sal(eno number) return number is
               begin
                  ............
               end;
              
               function get_sal(name varchar2) return numnber is
               begin
                 ......................
               end;
               --构造方法初始化全局变量 min_sal,max_sal
               begin
                  select min(sal),max(sal) into min_sal,max_sal from emp ;
               end;
              
           end;
 
  《4》使用纯度级别
         当使用包的公共函数时,它既可以作为包的一部分使用,也可以作为表达式的一部分使用,也可以作在sql 语句中使用,
         但如果要在sql 中引用包的公共函数,那么该公共函数不能包含dml 语句(insert,update,delete),也不能读取远程的变量,
         为了对包的公共函数进行限制,在定义包规范是将使用纯度级别(purity level)限制公共函数。
          1.wnds ; 用于限制函数不能修改数据
          2.wnps ; 用于限制函数不能修改包变量
          3.rnds ; 用于限制函数不能读取数据库数据
          4.rnps ;用于限制函数不能读取包变量
         eg
          create or replace package emp_purity is
              min_sal number(8,2);
              max_sal number(8,2);
              function get_maxsal return number;
              function get_minsal return number;
              --  prama restrict_references 用于纯度级别限制
              prama restrict_references(get_maxsal wnds);
              prama restrict_references(get_minsal wnds)
          end;
         









*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值