Max Val 函数没有像我预期的那样工作

Max Val function not working as I expected it to work

我写了这个查询我不知道为什么它对我不起作用任何人都可以为我建议哪个是正确的

SELECT MAX(NVL(CPV.SR_NO,0)+1) INTO :CPV.SR_NO FROM CPV
WHERE VOUCHER_ID=4;

我必须带上 MAX 值我放了 0 但它永远不会在一条记录后为第一条记录带上 1 它正常工作意味着如果 table 为空那么在一条记录保存后第一个条目不给 1 比它显示的1 even nvl 显示为 null 到 0 然后 + 1 请纠正我 谢谢

如果没有包含 VOUCHER_ID = 4 的行,那么您将 MAX 用于零行,并且始终是 NULL - 您使用什么表达式并不重要MAX结束了。您使用的 NVL 仅在 VOUCHER_ID = 4 时才有效,但在这些行中,您可能在 [=19] 中有 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,但由于查询对您有效,所以我认为它没问题。 EDIT - 我刚刚尝试过,至少在 Oracle 12.2 中,这样的名称对于绑定变量是无效的;所以我不确定你的代码是如何像发布的那样工作的。

另一个编辑

整个事情可以进一步简化。我们只需要将 NVL 从 MAX 中拉出(以及添加 1):

SELECT NVL( MAX(SR_NO), 0) + 1 INTO :CPV.SR_NO FROM CPV WHERE VOUCHER_ID=4;