Oracle-包详解

---------------     package 包   包定义  包主体  
---包定义
create or replace  package  my_package
is
  --声明部分
  function   my_fun01  return number ;--- 声明一个无参函数   ---共有函数 全局 
  
  v_num  number ;-- 变量 全局变量
end my_package;


--- 包体
create or replace package body  my_package
is   
   ------------声明部分  
     --私有变量
   v_return number(2);
   v_return1 varchar2(20);
   ---定义私有函数
   function   my_fun02  return  varchar2
   is    
   begin
       dbms_output.put_line('my_fun02  私有  。。。。。。');
       
      -- v_return:= my_fun01(); 小心递归
       
       return '私有方发';
   end my_fun02;
   
   ----  包中声明的子程序   必须在 包体中定义   
   function   my_fun01  return  number
   is    
   begin
       dbms_output.put_line('my_fun01  共有有  。。。。。。');
       
       v_return1:= my_fun02;
       dbms_output.put_line('my_fun01调用02  返回值是:  。。。。。。'||v_return1);
       return 1;
   end my_fun01;
begin   ----   包中的执行体   第一次调用的时候  为了初始化 变量
   dbms_output.put_line('my_package 包  执行体  。。。。。。');
   v_return1:= my_fun02;
   dbms_output.put_line('my_package 包  执行体  调用私有 fun02 返回值是:  。。。。。。'||v_return1);
   ---初始化  数据
   v_num:=15;
   
end my_package;

declare
v_return number; 
v_return1  varchar2(10);
begin
  ---  包外 不访问私有的函数
 --v_return1:=my_package.my_fun02;
 v_return:=my_package.my_fun01;----- 在包外 访问共有的函数 子程序
 dbms_output.put_line(my_package.v_num);---在包外 访问共有的变量  
end;
------- 学生  
create table  stu_tab
(
  sid  number(4) primary  key,
  sname varchar2(20),
  cid number(5)
)


---- 班级  class
create  table cla_tab
(
  cid  number(5) primary  key,
  cname varchar2(20)
  
)
alter  table stu_tab add  constraint  for_cid foreign  key  (cid)  references cla_tab(cid) 


--- 添加学生   
insert  into  stu_tab  values(1,'张振朝阳',1);

create  or replace package  stu_package 
is
    -----记录类型 全局
    type  stu_type  is record(
    s_id  number(4),
    s_name varchar2(20),
    c_id number(5)
    
    ) ;

    ----声明 函数  返回是否添加成功
    function   add_stu(stu  stu_tab) return boolean;
    
     
end stu_package;


create or replace package body stu_package
is
     v_flag  boolean;
     --- 定义一个变量   接受班级
     v_cla  cla_tab%rowtype;
    ----定义 函数  返回是否添加成功
    function   add_stu(stu  stu_type) return boolean
     is

     begin

       select *  into  v_cla  from cla_tab  where cid=stu.c_id; -- 如果没有查到  先添加班级
       insert  into  stu_tab  values(stu.s_id ,stu.s_name,stu.c_id );
       
       return true; ---没有结束方法  
     exception
       when  no_data_found  then
            insert  into  cla_tab  values(stu.c_id,stu.c_id||'班级'   )  ;
            v_flag:=add_stu(stu);
            return true;
       when  dup_val_on_index then
            dbms_output.put_line (sqlcode||sqlerrm);
            return false;
     end add_stu;

end stu_package;

declare
---记录类型的变量   引用包定义中的 记录类型
v_stu  stu_package.stu_type;

v_flag boolean;

v_sid  number:=&n;
v_sname  varchar2(10):=&nn;
v_scid  number:=&m;


begin
  v_stu.s_id:=v_sid;
  v_stu.s_name:=v_sname;
  v_stu.c_id  :=v_scid;

v_flag:=stu_package.add_stu(v_stu);

 if v_flag then
    dbms_output.put_line ('添加成功');
 else
   dbms_output.put_line ('添加失败');
 end if;


end;
select *from  stu_tab;
select *from  cla_tab;
-------------------  过程     方法的重载  名字 相同  作用域相同   参数列表不同  
create  or  replace  package  test_package
is
   ---游标  
   type  c_cursor_type is ref cursor return stu_tab%rowtype;
   
   --- 过程  重载   
   procedure  show_v_cur (p_info  varchar2 );
   procedure  show_v_cur (p_info  varchar2 );
   procedure  show_v_cur (p_info  number );
   procedure  show_v_cur (p_info  number,p_info2 varchar2 );
  -- procedure  show_v_cur (p_info   varchar2,p_info2 number );
   procedure  show_v_cur (p_info2   varchar2,p_info number );
end;

   
create  or  replace  package body  test_package
is
    
   
   --- 定义过程  重载   
   procedure  show_v_cur (p_info  varchar2  ) 
   is
   
   begin
      dbms_output.put_line ('p_info  varchar2 ');
   end   show_v_cur;
   
   procedure  show_v_cur (p_info  number )
   is
   
   begin
      dbms_output.put_line ('p_info  number ');
   end   show_v_cur;
   
   
   procedure  show_v_cur (p_info  number,p_info2 varchar2 )
   is
   
   begin
      dbms_output.put_line ('p_info  number,p_info2 varchar2 ');
   end   show_v_cur;
   
   procedure  show_v_cur (p_info   varchar2,p_info2 number )
   is
   
   begin
      dbms_output.put_line ('p_info   varchar2,p_info2 number');
   end   show_v_cur; 
   
    procedure  show_v_cur (p_info2   varchar2,p_info number )
      is
   
   begin
      dbms_output.put_line ('p_info2   varchar2,p_info number');
   end   show_v_cur; 
end;


begin
  test_package.show_v_cur(111);
  test_package.show_v_cur('123');
  --test_package.show_v_cur(111,'123');
  test_package.show_v_cur(p_info=>'123',p_info2=>111);  --- 可以 实现   参数名 重载效果 定位传参
  test_package.show_v_cur(p_info2=>'123',p_info=>111);
end;


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值