极其离谱的现象看哪位超级高手能揭开谜底。

mole 2009-02-03 08:44:42
各位,想请问下面下面两个问题:

问题一:
两种存储过程的写发在不同的Oracle数据库中(结构完全相同,数据量不同,一个是测试库,一个是真实运行库)执行过程中为何有差异:
写法一在测试库上是正确的,在真实库上在执行时update语句影响了5倍的正常记录,我们检查过数据,数据是正确的。
写法二在测试库和真实库上都是正确的。
我们估计可能是Oracle的执行上有问题。

写法一:
v_RESULTCOUNT NUMBER;
BEGIN
SELECT COUNT(DISTINCT PRODUCTID)
INTO v_RESULTCOUNT
FROM TSALESORDERITEMS
WHERE SALESORDERID = v_SALESORDERID
AND VALID = 'T';
UPDATE TPRODUCTSTOCK A
SET BALANCE = BALANCE - (SELECT SUM(LOCATEDQTY)
FROM TSALESORDERITEMS B
WHERE A.PRODUCTID = B.PRODUCTID
AND B.SALESORDERID = v_SALESORDERID
AND B.VALID = 'T'
GROUP BY B.PRODUCTID),
RESERVEDQTY = RESERVEDQTY -
(SELECT SUM(LOCATEDQTY)
FROM TSALESORDERITEMS C
WHERE A.PRODUCTID = C.PRODUCTID
AND C.SALESORDERID = v_SALESORDERID
AND C.VALID = 'T'
GROUP BY C.PRODUCTID),
LOCATEDQTY = LOCATEDQTY -
(SELECT SUM(LOCATEDQTY)
FROM TSALESORDERITEMS D
WHERE A.PRODUCTID = D.PRODUCTID
AND D.SALESORDERID = v_SALESORDERID
AND D.VALID = 'T'
GROUP BY D.PRODUCTID),
LASTMODIFYTIME = to_char(sysdate, 'YYYYMMDDHH24MISS'),
Importtime = '**************'
WHERE WAREHOUSEID = v_WAREHOUSEID
AND A.VALID = 'T'
AND EXISTS (SELECT 1
FROM TSALESORDERITEMS E
WHERE A.PRODUCTID = E.PRODUCTID
AND E.SALESORDERID = v_SALESORDERID
AND E.VALID = 'T'
GROUP BY E.PRODUCTID
HAVING A.BALANCE >= SUM(E.LOCATEDQTY));

IF SQL%ROWCOUNT <> v_RESULTCOUNT THEN
v_ERRORCODE := -20018;
END IF;
END;
写法二:
v_RESULTCOUNT NUMBER;
v_AFFEATED NUMBER:=0;
BEGIN
SELECT COUNT(DISTINCT PRODUCTID)
INTO v_RESULTCOUNT
FROM TSALESORDERITEMS
WHERE SALESORDERID = v_SALESORDERID
AND VALID = 'T';
FOR I IN (SELECT PRODUCTID,SUM(LOCATEDQTY) LOCATEDQTY
FROM TSALESORDERITEMS
WHERE SALESORDERID=v_SALESORDERID
AND VALID='T'
GROUP BY PRODUCTID
) LOOP
UPDATE TPRODUCTSTOCK A
SET BALANCE = BALANCE - I.LOCATEDQTY,
RESERVEDQTY = RESERVEDQTY -I.LOCATEDQTY,
LOCATEDQTY = LOCATEDQTY -I.LOCATEDQTY,
LASTMODIFYTIME = to_char(sysdate, 'YYYYMMDDHH24MISS')
WHERE WAREHOUSEID = v_WAREHOUSEID
AND A.VALID = 'T'
AND A.PRODUCTID=I.PRODUCTID
AND A.BALANCE>=I.LOCATEDQTY;

v_AFFEATED:=v_AFFEATED+SQL%ROWCOUNT;

END LOOP;

IF v_AFFEATED <> v_RESULTCOUNT THEN
v_ERRORCODE := -20018;
END IF;
END;

问题二
就上面第一个存储过程,我们发现对Update语句增加一个对以前不使用的字段赋个值也能使脚本执行正确,但是过了一天就不行了,这个不知是什么原因。
...全文
187 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
mole 2009-02-24
  • 打赏
  • 举报
回复
这两段脚本的逻辑是一致的,甚至有一次,当第一段脚本失败的时候,我们对数据表TSalesOrderItems做了统计,就执行正确了,但是后来这个方法就不灵了。
djs00717 2009-02-13
  • 打赏
  • 举报
回复
有问题,进行差异分析,不就一目了然了吗
wyquan101 2009-02-13
  • 打赏
  • 举报
回复
帮顶
friendjin 2009-02-13
  • 打赏
  • 举报
回复
有问题,进行差异分析,不就一目了然了吗
mole 2009-02-13
  • 打赏
  • 举报
回复
好象是因为SQL%ROWCOUNT这个值出了问题,哪位高手能够给出答案呀?????
mole 2009-02-09
  • 打赏
  • 举报
回复
不知版主能否回答一下。
多壮志 2009-02-03
  • 打赏
  • 举报
回复
太长,怕看这么常的SQL.
最简单的办法是,你别更新了,做一个类似的测试过程:只输出记录数,不要更新.
又是违规昵称 2009-02-03
  • 打赏
  • 举报
回复
写法一批量更新,写法二用循环一条条的更新

通常在写法二的情形下不容易出错,而一容易出错
hebo2005 2009-02-03
  • 打赏
  • 举报
回复
我看应该是你真实库和测试库的数据差异造成的,再仔细分析下数据
watson110 2009-02-03
  • 打赏
  • 举报
回复
oh my god
SimpleYeah 2009-02-03
  • 打赏
  • 举报
回复
同意一楼的说法.在批量更新数据的时候最容易出现的~

3,490

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧