CREATE OR REPLACE PROCEDURE tz_fc(rq1 IN VARCHAR2,czybm IN VARCHAR2)
AS
spbm2  T_pdmx.spbm%TYPE;
ck_sl2          number;
        resault         number;
        bmbm2           t_pdmx.bmbm%type;
sl2  T_pdmx.sl%TYPE;
        kcsl2 T_pdmx.kcsl%TYPE;
        

        CURSOR pd IS 
SELECT spbm,sl,kcsl 
FROM t_pdmx
WHERE rq=rq1 and  clbz='0' 
           ORDER BY spbm 
        FOR UPDATE OF clbz,tzr,tzrq;        
BEGIN
OPEN pd;
LOOP
spbm2:='';
kcsl2:='';
sl2:='';
                bmbm2:='';
FETCH fc INTO spbm2,kcsl2,sl2,bmbm2;
EXIT WHEN fc%NOTFOUND;

select sum(sl) sl into ck_sl2 from t_ckmx where spbm=spbm2;
                resault:=sl2-kcsl2+ck_sl2;
                 
IF  resault>=0 THEN
UPDATE T_pdmx 
SET clbz='z',
xgr=czybm,
xgrq=sysdate 
WHERE CURRENT OF pd;
        insert into t_ykmx(rq,dh,lb,ly,bmbm,spbm,sl,lrr,lrrq,clbz) values(rq1,nvl(max(nvl(dh,0)),0)+1,'y','0',bmbm2,spbm2,resault,czybm,sysdate,'0');
                          else
                                 update t_pdmx
                                        set clbz='z',
                                        xgr=czybm,
                                        xgrq=sysdate
                                        WHERE CURRENT OF pd;
                                insert into t_ykmx(rq,dh,lb,ly,bmbm,spbm,sl,lrr,lrrq,clbz) values(rq1,nvl(max(nvl(dh,0)),0)+1,'k','0',bmbm2,spbm2,abs(resault),czybm,sysdate,'0'); END IF;
EXIT; 
END LOOP;
CLOSE pd; 

COMMIT;
EXCEPTION WHEN OTHERS THEN NULL;
END;帮忙看看错在哪里呀!!!!!!!!!!!!
--盘点明细
  drop table t_pdmx;
create table t_pdmx
(
rq varchar2(8)  not null, --盘点日期
dh number      not null, --盘点单号
bmbm varchar2(2)  not null, --部门编码
spbm varchar2(6)  not null, --商品编码
kcsl number(14,4) not null, --库存数量
sl number(14,4), --盘点数量(实际盘点数)
dwbm varchar2(5), --单位编码
jyfs varchar2(1), --商品属性
dlm varchar2(2), --大类码
lrr varchar2(10) not null, --录入操作员编码
lrrq date default sysdate not null, --录入日期
xgr varchar2(10), --修改操作员编码
xgrq date, --修改日期
tzr varchar2(10), --调整操作员编码
tzrq date, --调整日期
clbz varchar2(1)  default '0' not null, --处理标志(0-未生成盈亏,Z-已生成盈亏)
fdmc    varchar2(20)                            --分店名称
)
/--盈亏明细
  drop table t_ykmx;
create table t_ykmx
(
rq varchar2(8)  not null, --日期(业务发生日期)
dh number      not null, --单号(业务单据号)
lb varchar2(1), --类别(Y-盘赢,K-盘亏)
ly varchar2(1)  not null, --盈亏来源(0-机器自动,1-手工录入盈亏)
bmbm varchar2(2), --部门编码
spbm varchar2(6)  not null, --商品编码
js number(14,4), --件数
mjsl number(14,4), --每件数量
sl number(14,4) not null, --数量(业务数量)
bz varchar2(100), --备注
dwbm varchar2(5), --单位编码
jyfs varchar2(1), --经营方式(商品属性)
jhjg number(14,4), --进货价格
jhbh number, --进货编号(批次号)
dlm varchar2(2), --大类码
zzsl number(3), --增值税率
scrq varchar2(8), --生产日期(保质报警用)
lrr varchar2(10) not null, --录入操作员编码
lrrq date default sysdate not null, --录入日期
xgr varchar2(10), --修改操作员编码
xgrq date, --修改日期
shr varchar2(10), --审核人
shrq date, --修改日期
tzr varchar2(10), --调整操作员编码
tzrq date, --调整日期
clbz varchar2(1)  default '0' not null, --处理标志(0-未调库存,Z-已调库存)
dycs number      default 0,         --打印次数
fdmc    varchar2(20)                            --分店名称
)
/

解决方案 »

  1.   

    FETCH fc INTO spbm2,kcsl2,sl2,bmbm2;
    EXIT WHEN fc%NOTFOUND;
    中的fc我已经改成pd了,还是不行。
      

  2.   

    select sum(sl) sl into ck_sl2 from t_ckmx where spbm=spbm2;
    以上这条语句不存在记录时会出错。这条语句不明白为何在值那里出现函数nvl,max
    insert into t_ykmx(rq,dh,lb,ly,bmbm,spbm,sl,lrr,lrrq,clbz) values(rq1,nvl(max(nvl(dh,0)),0)+1,'y','0',bmbm2,spbm2,resault,czybm,sysdate,'0');还有在end if 后多了一个EXIT; 这样游标只作一次循环,是否你的意思?