update A set B=NVL(LOOKUP_B(A),0) C=NVL(LOOKUP_C(A),0) D=B + C WHERE YEAR='2004'这里的D=B+C=NVL(LOOKUP_B(A),0)+C=NVL(LOOKUP_C(A),0)至于为什么=0,要看看前面的b和c为什么=0了问题因该还是两个自定义函数的问题
update A set B=NVL(LOOKUP_B(A),0), C=NVL(LOOKUP_C(A),0), D=NVL(LOOKUP_B(A),0) + NVL(LOOKUP_C(A),0) WHERE YEAR='2004'
to NinGoo(宁哥): 这里的D=B+C=NVL(LOOKUP_B(A),0)+C=NVL(LOOKUP_C(A),0)你建张表做做看,是你的结论吗?
不好意思,忘了给大家说明了B,C,D之间没有逗号是笔误,LOOKUP_B(A)和LOOKUP_C(A),是我写的自定义函数,里面只有一个游标,就是根据A的值求和以后得到B,C的值.需要更新的记录大概3万条,实在没办法,我改成 update A set B=NVL(LOOKUP_B(A),0), C=NVL(LOOKUP_C(A),0), D=NVL(LOOKUP_B(A),0) + NVL(LOOKUP_C(A),0) WHERE YEAR='2004' 这样没问题 但为什么B+C就不行啊,要知道更新3万条记录重复LOOKUP一次要多花时间的.
感觉问题不是出在insert上,应该是出在别的问题上不过你写的也有问题 update A set B=NVL(LOOKUP_B(A),0) C=NVL(LOOKUP_C(A),0) D=B + C WHERE YEAR='2004'应该这么写 update A set B=NVL(LOOKUP_B(A),0) C=NVL(LOOKUP_C(A),0) D=NVL(LOOKUP_B(A),0) + NVL(LOOKUP_C(A),0) WHERE YEAR='2004'
onejune4450(中文字符) 我觉得也是这样的,如果是的话可以分成两句去做1 update tb set b=...,c=... 2 update tb set d=...这样好象会快些。不用做两次lookup函数了
onejune4450(中文字符) 我觉得也是这样的,如果是的话可以分成两句去做1 update tb set b=...,c=... 2 update tb set d=...这样好象会快些。不用做两次lookup函数了
set后面的 B,C,D之间没有逗号吗? 应该是笔误吧
update A set
D=B + C
WHERE YEAR='2004'就是不用LOOKUP_B,LOOKUP_C,会不会OK
如果是这样就可以合并为一个存储过程。
===================================================
调用第一个存储过程,执行INSERT后COMMIT了吗?
B=NVL(LOOKUP_B(A),0)
C=NVL(LOOKUP_C(A),0)
D=B + C
WHERE YEAR='2004'这里的D=B+C=NVL(LOOKUP_B(A),0)+C=NVL(LOOKUP_C(A),0)至于为什么=0,要看看前面的b和c为什么=0了问题因该还是两个自定义函数的问题
B=NVL(LOOKUP_B(A),0),
C=NVL(LOOKUP_C(A),0),
D=NVL(LOOKUP_B(A),0) + NVL(LOOKUP_C(A),0)
WHERE YEAR='2004'
这里的D=B+C=NVL(LOOKUP_B(A),0)+C=NVL(LOOKUP_C(A),0)你建张表做做看,是你的结论吗?
update A set
B=NVL(LOOKUP_B(A),0),
C=NVL(LOOKUP_C(A),0),
D=NVL(LOOKUP_B(A),0) + NVL(LOOKUP_C(A),0)
WHERE YEAR='2004'
这样没问题
但为什么B+C就不行啊,要知道更新3万条记录重复LOOKUP一次要多花时间的.
也出先同样的问题,真是奇怪了.
和D=B+C是完全不同的用错了会造成不可挽回的损失建议楼主建个小表做些测试,看看到底是要用哪种方式去做更新
你说的不错,但是从贴子分析,业务的逻辑应该是
D=NVL(LOOKUP_B(A),0) + NVL(LOOKUP_C(A),0),我也是猜的。
update A set
B=NVL(LOOKUP_B(A),0)
C=NVL(LOOKUP_C(A),0)
D=B + C
WHERE YEAR='2004'应该这么写
update A set
B=NVL(LOOKUP_B(A),0)
C=NVL(LOOKUP_C(A),0)
D=NVL(LOOKUP_B(A),0) + NVL(LOOKUP_C(A),0)
WHERE YEAR='2004'
2 update tb set d=...这样好象会快些。不用做两次lookup函数了
2 update tb set d=...这样好象会快些。不用做两次lookup函数了