各位大侠好。
我遇到这样一种情况
我向ORACLE 发一批数据过去 通过存储过程同时修改几个表 但是其中有一个表的数据插入没执行,撤销以前的操作,再次执行,又可以了。 这中情况偶尔才会出现。 当时网络很比较差,系统运行得也很慢, 向ORACLE插入数据,会丢失少量数据,即插入的数据不全 ?
我遇到这样一种情况
我向ORACLE 发一批数据过去 通过存储过程同时修改几个表 但是其中有一个表的数据插入没执行,撤销以前的操作,再次执行,又可以了。 这中情况偶尔才会出现。 当时网络很比较差,系统运行得也很慢, 向ORACLE插入数据,会丢失少量数据,即插入的数据不全 ?
解决方案 »
- 关于求上级数量的问题。
- oracle如何查询不重复数据
- 急啊!通过透明网关抽sybase数据到oracle速度慢
- 存储过程总是编译错,创建的过程带有编译错误。!!!
- sqlplus我运行一个select语句。有时不能执行。
- 在ORACLE过程中字符串"8;26;14;24;"怎样循环插入表中!
- 菜鸟面试急需解决的问题!
- Oracle9i在P4的机器上装是不是有问题?
- 模糊概念
- 函数问题:很简单,在线等待。
- 在Oracle中,如何将一张表中的long字段的数据插入到另一张表中的clob的字段中
- sqlplus登录问题,用system/orcl可以登录,用system/orcl@orcl就登录不了,就死在那里,没有任何提示.
因为对这个表是进行连续插入的,这样会对表引起死锁吗?发生这个问题的具体情况是这样的,我在应用程序界面上点击一个复选框,当复选框值为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 语句的可能性很小。希望能听到更好的意见。
--付款申请(单位和付款号的金额和代扣)
--单位存在,就更新并取得序号
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;
如果是这种情况的话,就很可能出现一次可以、一次不可以的情况。
主要是因为
PL/SQL中的类型的隐式转化问题,跟SQL池中的SQL分析执行计划有关。后一次会
自动使用前一次的执行计划,如果被page out后,则使用新的执行计划。
建议不要使用这种变量类型的隐式转化。