各位大侠好。
             我遇到这样一种情况             
             我向ORACLE 发一批数据过去              通过存储过程同时修改几个表              但是其中有一个表的数据插入没执行,撤销以前的操作,再次执行,又可以了。             这中情况偶尔才会出现。             当时网络很比较差,系统运行得也很慢,  向ORACLE插入数据,会丢失少量数据,即插入的数据不全 ?

解决方案 »

  1.   

    不会是oracle的问题,只能是程序的问题.
      

  2.   

    应该是程序的逻辑上的问题,仔细检查一下吧,实在不行就贴出来看看。如果几个表为了保持数据一致性,插入必须做成事务的话,commit就放到最后,否则可以试着一个表一个表的commit。
      

  3.   


    因为对这个表是进行连续插入的,这样会对表引起死锁吗?发生这个问题的具体情况是这样的,我在应用程序界面上点击一个复选框,当复选框值为Y 时,调用存储过程向T_SS_SETTLEMENT_RECORD,T_SS_PAYMENT_list 
    表插入数据,T_SS_SETTLEMENT_RECORD的插入语句在T_SS_PAYMENT_list 表插入语句后执行,
    现在是T_SS_PAYMENT_list 没有插入,而T_SS_SETTLEMENT_RECORD 确插入成功了。
    当时对T_SS_PAYMENT_list数据插入量比较多我反复检查了下存储过程,认为没执行T_SS_PAYMENT_list INSERT 语句的可能性很小。希望能听到更好的意见。
      

  4.   

    当T_SS_PAYMENT_list 插入失败后,我取消以前的操作,在到界面点击复选框,设置为Y值,结果操作成功了。又没出现上面的情况。
      

  5.   

    我把插入的语句贴出来给大家看看: if  Ll_Temp > 0 then
        --付款申请(单位和付款号的金额和代扣)
        --单位存在,就更新并取得序号
        update T_SS_PAYMENT_LIST
         set   NPAY_AMOUNT=NPAY_AMOUNT+adc_amount,
               NDED_AMOUNT=NDED_AMOUNT+ldc_NBE_DEDUCT_MONEY,
               nrea_amount=NPAY_AMOUNT +adc_amount - NDED_AMOUNT - ldc_NBE_DEDUCT_MONEY,
               PUB_REMARK=ls_snote,
               PUB_MODI_DATE=sysdate,
               PUB_MODI_PERSON=as_operatorid
         WHERE T_SS_PAYMENT_LIST.SREC_SEQUENCE=As_srec_sequence
              AND T_SS_PAYMENT_LIST.PUB_VALIDLY='Y'
              AND T_SS_PAYMENT_LIST.sorg_id=as_sorg_id
              and T_SS_PAYMENT_LIST.NPAY_SEQUENCE=ldc_NPAY_SEQUENCE;else
          --付款申请(单位和付款号的金额和代扣) 没有单位就添加记录
          --查找最大的序号,序号对应单位
           SELECT max(NPAY_SEQUENCE)
               Into ldc_NPAY_SEQUENCEmax
              FROM T_SS_PAYMENT_LIST
              WHERE T_SS_PAYMENT_LIST.SREC_SEQUENCE=As_srec_sequence
              AND T_SS_PAYMENT_LIST.PUB_VALIDLY='Y'
              AND T_SS_PAYMENT_LIST.sorg_id=as_sorg_id ;
              ldc_NPAY_SEQUENCEmax:=nvl(ldc_NPAY_SEQUENCEmax,0)+1;
              ldc_NPAY_SEQUENCE:=ldc_NPAY_SEQUENCEmax;
             INSERT INTO T_SS_PAYMENT_LIST
              (SREC_SEQUENCE,NPAY_SEQUENCE ,SUNIT_ID ,NBILL_QUANTITY ,NPAY_AMOUNT,
               NDED_AMOUNT  ,NREA_AMOUNT   ,SCHECK_ID ,TCHECK_DATE,CCHECK_STAT ,
               CPAY_STAT,CBACKREG_STAT,NPRINT_TIMES,SSIGN_ID , TSIGN_DATE ,CSIGN_STAT ,
               SORG_ID, PUB_BRANDCODE ,PUB_PRODCODE,PUB_VALIDLY,PUB_REMARK ,PUB_CREATE_PERSON,
               PUB_CREATE_DATE,PUB_MODI_PERSON,PUB_MODI_DATE,SPAY_SEQUENCE,SSIGN_SEQUENCE,
               SUSAGE_NAME,SFEE_TYPE,SPAY_CAUSE,SDEPARTMENT_NAME)
               VALUES(As_srec_sequence,ldc_NPAY_SEQUENCEmax,ls_sunit_id,1,adc_amount,
                      ldc_NBE_DEDUCT_MONEY,adc_amount - ldc_NBE_DEDUCT_MONEY,'',null,'N',
                      'N','N',0,null,null,'N',
                      as_sorg_id,'',as_pub_prodcode,'Y',ls_snote,as_operatorid,
                      sysdate,as_operatorid,sysdate,'','',
                      '','','','');
    end if;-----------------------
    修改 T_SS_SETTLEMENT_RECORD
    if  as_ls_paystat = 'N' thenselect sum(nbe_deduct_money) into ldc_old_deudct_money from T_SS_DEDUCT_DETAIL  WHERE  SSETTLEMENT_ID=as_ssettlement_id; if ldc_old_deudct_money is null then
         ldc_old_deudct_money:=0;   end if ;    as_ncountervail_amount:=ldc_old_deudct_money;
       update T_SS_SETTLEMENT_RECORD
       set NCOUNTERVAIL_AMOUNT =ldc_old_deudct_money,
           SAPP_SEQUENCE  = '',
       CACC_PAY_STAT = 'N',
       tacc_pay_date = null,
       sacc_pay_id = '',
       PUB_MODI_PERSON =as_operatorid,
        PUB_MODI_DATE =sysdate
       where SSETTLEMENT_ID=as_ssettlement_id;
    else    as_ncountervail_amount:=ldc_NBE_DEDUCT_MONEY;
       update T_SS_SETTLEMENT_RECORD
       set NCOUNTERVAIL_AMOUNT =NVL(NCOUNTERVAIL_AMOUNT,0)+NVL(ldc_NBE_DEDUCT_MONEY,0),
           SAPP_SEQUENCE  = As_srec_sequence,
       CACC_PAY_STAT = as_ls_paystat,
       tacc_pay_date = sysdate,
       sacc_pay_id = as_operatorid,
        PUB_MODI_PERSON =as_operatorid,
        PUB_MODI_DATE =sysdate
       where SSETTLEMENT_ID=as_ssettlement_id;
    end if;
      

  6.   

    会不会是if  Ll_Temp > 0 then  这个语句中l1_Temp 为非number类型?
    如果是这种情况的话,就很可能出现一次可以、一次不可以的情况。
    主要是因为
    PL/SQL中的类型的隐式转化问题,跟SQL池中的SQL分析执行计划有关。后一次会
    自动使用前一次的执行计划,如果被page out后,则使用新的执行计划。
    建议不要使用这种变量类型的隐式转化。