oracle---包--laobai

 包(package)
 作用:逻辑对象的一种。对相关存储过程、函数、变量的封装。
   a 封装,便于调用  b 统一授权
 系统内置包:dbms_output。用于输出。
  standard:常用的函数。异常的定义

  自定义包:
  包头:package。声明公有的函数、存储过程及公有变量。
  包体:package body。实现包头声明的函数、存储过程。定义私有变量。
--调用系统的内置包
begin
sys.dbms_output.put_line('111');
sys.dbms_output.put_line(
sys.standard.LTRIM(' bbb ')
);
end;

--创建自定义包。四则运算工具包
--创建包头
create or replace package my_math_pack
is
  ver varchar2(20):='v0.1版本';  --声明并初始化公有变量
  procedure showauthor; --声明1个公有存储过程。显示作者
  function add(i number,j number)
  return number;   --声明1个公有函数。加法运算

  function div(i number,j number)
  return number;   --声明1个公有函数。除法运算。
end;

--创建包体
create or replace package body my_math_pack
is
 -- 实现1个公有存储过程。显示作者 
 procedure showauthor
  as
  begin
     dbms_output.put_line('作者:老白');      
  end;
 
   --实现1个公有函数。加法运算
  function add(i number,j number)
  return number
  as
  begin
      return i+j;
  end;
  
  --实现1个公有函数。除法运算。
  function div(i number,j number)
  return number
  as  
  begin
      return i/j;
  end;
end;
  

--调用自定义包

begin
 --调用包里的函数 
 dbms_output.put_line(system.my_math_pack.add(8,9));
 system.my_math_pack.showauthor();
 --显示包的公有变量
  dbms_output.put_line(system.my_math_pack.ver);
end;


--练习
  /*
创建自定义包  my_string_pack
包含 2个函数声明 

    函数1,返回2个字符串中,长度较长的那个
    函数2,如果字符串2是字符串1的子串,返回1,否则返回0.
    */
    
   create or replace package my_string_pack
   is
          function getlonger(str1 varchar2,str2 varchar2)
          return varchar2; 
          function isexists(str1 varchar2,str2 varchar2)
          return number;    
   end;
   
   create or replace package body my_string_pack
   is
        function getlonger(str1 varchar2,str2 varchar2)
          return varchar2
          as
          begin
              if (length(str1)>length(str2)) then
                  return str1;
                else
                  return str2;
               end if;
          end;
          function isexists(str1 varchar2,str2 varchar2)
          return number
          as
          begin
               if (instr(str1,str2)>'0') then
               return 1;
               else
               return 0;
               end if;                       
          end;
   end;
   
   
   begin
     dbms_output.put_line(my_string_pack.getlonger('aaa','bbb'));
     dbms_output.put_line(my_string_pack.isexists('aaa','bb'));
   end;
   
   
   --- 案例2,创建my_emp_pack,对emp表进行如下操作
   /*
   1 存储过程,输出所有工资大于等于指定工资的员工号,员工姓名及工资   
   2 函数。获取指定部门号且岗位为"CLERK"的员工的最高工资
   */
   
    --包头
   create or replace package my_emp_pack
   is

        procedure show_sal_greater_than(
           in_sal number
        )  ;

        function get_max_sal(
           v_deptno number
        )return number;
   end;
   
   --包体
create or replace package body my_emp_pack
      is
        procedure show_sal_greater_than(
           in_sal number
        )
        as
          --声明1个游标
         cursor v_cur
           is
            select empno,ename,sal from scott.emp where sal>=in_sal;
          v_eno scott.emp.empno%type;
          v_ename scott.emp.ename%type;
          v_sal scott.emp.sal%type;
        begin
             --打开
             if (not v_cur%isopen) then
             open v_cur;
             end if;
             --依次提取
             loop
                exit when (v_cur%notfound);
                fetch v_cur into v_eno,v_ename,v_sal;
                dbms_output.put_line('第'||v_cur%rowcount||':'||v_eno
                ||','||v_ename||','||v_sal);
             end loop;
             --关闭
             close v_cur;
        end;



        function get_max_sal(
           v_deptno number
        )return number
        as
           v_max number;
        begin
           select sal into v_max from scott.emp
           where deptno = v_deptno and job='CLERK';
           return v_max;
           exception
              when no_data_found then
              dbms_output.put_line('找不到记录');
                   return -1;
        end;
   end;
   
   begin
        --system.my_emp_pack.show_sal_greater_than('15000');
       dbms_output.put_line(system.my_emp_pack.get_max_sal('40'));
   end;

  

posted @ 2017-01-06 15:11  ATJAVA  阅读(125)  评论(0编辑  收藏  举报