这个存储过程主要是将把下一个月的数据删除,然后将上一个月的数据差出来插入到下个月中!例如将2007-02的数据删除,在将2007-01的数据复制给2007-02!代码如下(在复制数据的时候就会跳出,单独运行SQL语句没错误):
CREATE OR REPLACE PROCEDURE Clearing_kjqj(gsdm IN varchar2,kjqj IN varchar2)
AS
v_gsdm    VARCHAR2(20); --公司代码
v_kjqj    VARCHAR2(20); --会计期间 格式为YYYY-MM
/************************************************************************/
/*中文名称: 年结的时候拷贝上一月基础数据给下一月用                 */
/*调用方法: Clearing_kjqj(gsdm,kjqj)                                  */
/*作者: 陈川                                  */
/*创建时间: 2007-12-17                             */
/*数据库版本:Oracle9204                              */
/*输入参数: gsdm,kjqj                                         */
/*输出参数:                               */
/*返回:                                             */
/*下级调用                               */
/************************************************************************/
BEGIN
v_gsdm:=gsdm;
v_kjqj:=to_char(add_months(to_date(kjqj,'yyyy-mm'),1),'yyyy-mm');
DELETE FROM cb_djb t where t.kjqj=v_kjqj and t.gsdm=v_gsdm;
DELETE FROM cb_clb t where t.kjqj=v_kjqj  and t.gsdm=v_gsdm;
DELETE FROM cb_fyxh t where t.kjqj=v_kjqj and t.gsdm=v_gsdm;
INSERT INTO cb_clb SELECT t.gsdm,v_kjqj,t.cpdm,t.jldw,t.jhcl,t.decl,t.bzcl,t.khcl,t.sjcl  FROM cb_clb t where t.kjqj=kjqj  and t.gsdm=v_gsdm;--产量表
INSERT INTO cb_djb SELECT v_kjqj,t.gsdm,t.dm,t.fzlx,t.jldw,t.jhdj,t.dedj,t.bzdj,t.khdj,t.gndj,t.gjdj,t.sjdj  FROM cb_djb t where t.kjqj=kjqj and t.gsdm=v_gsdm;--单价表
INSERT INTO cb_fyxh SELECT t.gsdm,v_kjqj,t.fydm,t.jldm,t.fzlxjg,t.fzdmjg,t.jhsl,t.desl,t.bzsl,t.khsl,t.sjsl,t.fzlx FROM cb_fyxh t where t.kjqj=kjqj and t.gsdm=v_gsdm;--吨钢消耗
Commit;
EXCEPTION
  WHEN OTHERS THEN
  ROLLBACK;
END Clearing_kjqj;

解决方案 »

  1.   

    根据你的情况, 可能是系统在执行的时候出了错误了, 捕捉错误并把错误输出来看看. ......
    BEGIN
    v_gsdm:=gsdm;
    v_kjqj:=to_char(add_months(to_date(kjqj,'yyyy-mm'),1),'yyyy-mm');
    DELETE FROM cb_djb t where t.kjqj=v_kjqj and t.gsdm=v_gsdm;
    DELETE FROM cb_clb t where t.kjqj=v_kjqj  and t.gsdm=v_gsdm;
    DELETE FROM cb_fyxh t where t.kjqj=v_kjqj and t.gsdm=v_gsdm;--提交, 
    commit;INSERT INTO cb_clb SELECT t.gsdm,v_kjqj,t.cpdm,t.jldw,t.jhcl,t.decl,t.bzcl,t.khcl,t.sjcl  FROM cb_clb t where t.kjqj=kjqj  and t.gsdm=v_gsdm;--产量表
    INSERT INTO cb_djb SELECT v_kjqj,t.gsdm,t.dm,t.fzlx,t.jldw,t.jhdj,t.dedj,t.bzdj,t.khdj,t.gndj,t.gjdj,t.sjdj  FROM cb_djb t where t.kjqj=kjqj and t.gsdm=v_gsdm;--单价表
    INSERT INTO cb_fyxh SELECT t.gsdm,v_kjqj,t.fydm,t.jldm,t.fzlxjg,t.fzdmjg,t.jhsl,t.desl,t.bzsl,t.khsl,t.sjsl,t.fzlx FROM cb_fyxh t where t.kjqj=kjqj and t.gsdm=v_gsdm;--吨钢消耗
    Commit;
    EXCEPTION
      WHEN OTHERS THEN  --把错误的信息输出来看看.  
      dbms_output.putline(sqlerrm);  ROLLBACK;
    END Clearing_kjqj;
      

  2.   

    你可以把错误的日志打印出来看看,在
    when others then
    output.putline(sqlerrm||to_char(sqlcode));
      

  3.   

     ORA-00001: 违反唯一约束条件 (CBGL.PK_CB_CLB)-1
      

  4.   

    我看了一下!PK_CB_CLB 主键为GSDM, KJQJ, CPDM !数据应该不会重复的啊!好奇怪,以前我测试是好的呢~怎么转到别的机器上就出问题了!