创建数据表a
CREATE TABLE a   

dt        varchar2(10),  
num       number(10),   
sum_num   number(10)  

向表a中插入5条记录      
insert into a values('201201',10,10);  
insert into a values('201202',20,20);  
insert into a values('201203',30,30);  
insert into a values('201204',40,40);  
insert into a values('201205',50,50); 
查询a表记录:
 创建函数sum_num()
create or replace function sum_num(dt  VARCHAR2)
return number
IS
  --PRAGMA AUTONOMOUS_TRANSACTION;
 n_Sum NUMBER;
begin
    select sum(nvl(b.num,0))
    into   n_Sum
    from  a b
     where b.dt<dt;
    return n_Sum;
end;
向表中插入一条记录:
方法一:
insert into a values('201206',60,sys.sum_num('201206'));
结果如下:
 方法二:
   insert into a values('201206',60,(select sum(b.num) from a b where b.dt<'201206')); 
为什么会出现不同的结果呢??

解决方案 »

  1.   


    create or replace function sum_num(v_dt VARCHAR2) --参数改个名字
    return number
    IS
       --PRAGMA AUTONOMOUS_TRANSACTION;
      n_Sum NUMBER;
    begin
       select sum(nvl(b.num,0))
       into n_Sum
       from a b
       where b.dt<v_dt; --这里如果写dt 数据库会把它当做字段名,并不会当做你的入参,结果自然就不一样了
       return n_Sum;
    end;
      

  2.   

    create or replace function sum_num(v_dt VARCHAR2) --参数改个名字
    return number
    IS
       --PRAGMA AUTONOMOUS_TRANSACTION;
      n_Sum NUMBER;
    begin
       select sum(nvl(b.num,0))
       into n_Sum
       from a b
       where b.dt<v_dt; --这里如果写dt 数据库会把它当做字段名,并不会当做你的入参,结果自然就不一样了
       return n_Sum;
    end;
      

  3.   

    function参数名不要和基表字段一样..
      

  4.   

    一楼看的好细,oracle好像是建议变量都加前缀 v_