修改一下,你自己试试
create or replace package pack_test  is
  
   v_bh  char(5);  /*公共变量*/   /*根据v_bh求和*/
   function fun_calc  return number ;    function fun_calc_batach(bh_in in  char ) return number;end pack_test;
/create or replace package body pack_test  is
  
--   v_bh  char(5);  /*公共变量*/   /*根据v_bh求和*/
   function fun_calc  return number is 
      Result  number := 0;    
   begin 
     select nvl(sum( qty * price ),0)
     into    Result  
     from    tbl
     where   bh = v_bh; 
     return Result;
   end fun_calc ;    function fun_calc_batach(bh_in in  char ) return number is
     v_total number :=0; 
   begin  
     v_bh    := bh_in;     /*公共变量赋值*/     v_total := fun_calc;  /*调用函数获取返回结果*/     return   v_total; 
   end fun_calc_batach;end pack_test;
/

解决方案 »

  1.   

    xzou(亡狼补齿) :
      你的意思是说要把 v_bh  公共变量定义在pack 中而不是pack body 中?
    这两者有什么本质的区别呢 ? 因为我在调试过程中发现,每次用不同的参数进行调用时,v_bh公共变量已经发生变化了!!但是结果还是没变!!
       可能你的方法是可行的,pack 中定义的public variable 和pack body中定义的private变量的区别在哪里??
      

  2.   

    公共变量应当声明到包的说明(package spec)里面
      

  3.   

    感谢各位的支持,刚才我把我的存储过程修改了一下:1.首先,我取消了公共变量v_bh,而在fun_calc(v_bh in char)中增加参数的方式   function fun_calc(v_bh in char)  return number is 
          Result  number := 0;    
       begin 
         select nvl(sum( qty * price ),0)
         into    Result  
         from    tbl
         where   bh = v_vh; 
       end fun_calc ; 2.在主函数中用参数调用的方式完成,而不是采用公共变量的方式:   function fun_calc_batach(bh_in in  char ) return number is
         v_total  number :=0; 
       begin  
         -- v_bh := bh_in;            /*取消公共变量赋值*/     v_total := fun_calc(bh_in);  /*参数调用*/     return   v_total; 
       end fun_calc_batach;3.最后的结果还是有问题,不过。我发现问题的主要根源在另外一个地方了:
    select nvl(sum( qty * price ),0)  from  tbl  where   bh = 'K0001';
    select nvl(sum( qty * price ),0)  from  tbl  where   bh = 'K0002';
    这些语句都是正常的。。但在function中调用时,当我输入的参数bh没有对应的记录时,不是返回0,而是返回数据库中已有的一个bh的汇总值,因为数据库中只有一个该bh!!
      

  4.   

    不对啊,我这里就没有问题啊SQL> create table tbl (
      2    bh char(5),
      3    qty  number,
      4    price number
      5    );表已创建。SQL> 
    SQL> 
    SQL> insert intO tbl(bh,qty,price) values('K0001','1','1234.00');已创建 1 行。SQL> COMMIT;提交完成。SQL> 
    SQL> create or replace package pack_test  is
      2    function fun_calc  return number ;
      3    function fun_calc_batach(bh_in in  char ) return number;
      4    
      5  end pack_test;
      6  /程序包已创建。SQL> 
    SQL> create or replace package body pack_test  is
      2    
      3     v_bh  char(5);  /*公共变量*/
      4  
      5     /*根据v_bh求和*/
      6     function fun_calc  return number is 
      7        Result  number := 0;    
      8     begin 
      9       select nvl(sum( qty * price ),0)
     10       into    Result  
     11       from    tbl
     12       where   bh = v_bh; 
     13       return Result;
     14     end fun_calc ; 
     15  
     16     function fun_calc_batach(bh_in in  char ) return number is
     17       v_total number :=0; 
     18     begin  
     19       v_bh    := bh_in;     /*公共变量赋值*/
     20  
     21       v_total := fun_calc;  /*调用函数获取返回结果*/
     22  
     23       return   v_total; 
     24     end fun_calc_batach;
     25  
     26  end pack_test;
     27  /程序包主体已创建。SQL> 
    SQL> select pack_test.fun_calc_batach('K0001') from dual;PACK_TEST.FUN_CALC_BATACH('K0001')
    ----------------------------------
                                  1234SQL> 
    SQL> select pack_test.fun_calc_batach('K0002') from dual;PACK_TEST.FUN_CALC_BATACH('K0002')
    ----------------------------------
                                     0SQL>