修改一下,你自己试试
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;
/
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;
/
你的意思是说要把 v_bh 公共变量定义在pack 中而不是pack body 中?
这两者有什么本质的区别呢 ? 因为我在调试过程中发现,每次用不同的参数进行调用时,v_bh公共变量已经发生变化了!!但是结果还是没变!!
可能你的方法是可行的,pack 中定义的public variable 和pack body中定义的private变量的区别在哪里??
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!!
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>