先看下需求:入库表主表(入库编号,入库日期,保管员,供应商,采购员)  
入库表从表(入库编号,物料编号,入库数量)  
帐表(年,月,物料编号,期初数量,入库数量,出库数量,库存量) 
我是这样做的:先插入入库单主表,再循环插入入库单从表,每插入从表一条,同时执行存储过程一次;
存储过程如下:y 年,m 月 ,id 商品编号 ,num 入库数量
create or replace procedure p
 (y   gsp_count.CT_YEAR%type, m gsp_count.CT_MONTH%type, id  gsp_count.CGD_ID%type, num gsp_count.CT_INPUTNUM%type)
as i number;
begin 
 select count(*)  into i from gsp_count  where CGD_Id=id AND CT_Year=y AND CT_Month=m;
        if i=0 then
        insert into gsp_count values (id,y,m,0,num,0,num);//帐中不存在,则插入
        else
       update gsp_count set CT_InPutNum=CT_InPutNum+num where CGD_Id=id AND CT_Year=y AND CT_Month=m;//更新帐
       update gsp_count set CT_FINALNUM =CT_INPUTNUM+ CT_PRENUM ;
       end if;
  end;
/感觉这样做,不太好,如果写帐表失败,我前面的操作已经执行,那就会造成账数据,请问高手是怎么处理  从插入主表,从表,到存储过程整个过程的 。。上面是增加入库单 ,下面讲讲更该入库单整个过程  。
先查询得到更改前的入库单日期,然后更改入库单主表 。然后查询入库单从表 ,可以得到商品编号,和数量 ,
然后先更新入库单从表 ,同样没执行一次,更新一下帐,
大家对我的逻辑给些好的建议 ,以及自己是如何做主从表的 增 ,删改 的存储过程的 ?小第向大家学习,先谢谢了,

解决方案 »

  1.   

    “感觉这样做,不太好,如果写帐表失败,我前面的操作已经执行,那就会造成账数据,请问高手是怎么处理  从插入主表,从表,到存储过程整个过程的 。。”怕这种情况,你就把子表作为数组在插入主表的那个存储过程传入啊,在一个存储过程里面完成。插入从表的另写一个函数,然后一个for
      

  2.   

    上面的语句就是一个事务啊 。执行成功后commit;失败 roolback.
      

  3.   

    过程的最后一个COMMIT,WHEN OTHERS ROOLBACK,任何异常都会回滚