我写这个查询,我不知道为什么它不适合我,谁能建议我哪一个是正确的
SELECT MAX(NVL(CPV.SR_NO,0)+1) INTO :CPV.SR_NO FROM CPV
WHERE VOUCHER_ID=4;
我必须带来最大值,我把0,但它从来没有带来1的第一个记录后,一个记录它正常工作意味着,如果表是空的,那么第一个条目不给1后,一个记录保存比它显示的1甚至nvl显示为空到0,然后+ 1请纠正我由于
如果没有VOUCHER_ID = 4
的行,那么您将MAX
取0行,并且始终是NULL
-无论您将MAX
取什么表达式。你使用的NVL
只有在VOUCHER_ID = 4
的行,但在这些行中,SR_NO
列中可能有NULL
。如果没有开始的行,这将没有帮助。
你可以这样写代码**:
SELECT MAX(SR_NO) INTO :CPV.SR_NO FROM CPV WHERE VOUCHER_ID=4;
:CPV.SR_NO := NVL(:CPV.SR_NO, 0) + 1;
即在SELECT
语句之外应用NVL
(并添加1)。
话虽如此,你试图用这种方式解决的业务问题是什么?不管你想解决什么问题,这看起来都是一个非常糟糕的方法。
**注意-我以前没有见过限定绑定变量名,如:CPV.SR_NO
,但由于查询为您工作,我认为它是好的。编辑-我刚刚尝试过,至少在Oracle 12.2这样的名称是无效的绑定变量;所以我不确定你的代码是如何工作的。
另一个编辑
整个事情可以进一步简化。我们只需要将NVL从MAX中拉出来(以及1的添加):
SELECT NVL( MAX(SR_NO), 0) + 1 INTO :CPV.SR_NO FROM CPV WHERE VOUCHER_ID=4;