Oracle Max Val函数未按预期工作

Oracle Max Val函数未按预期工作,oracle,oracle11g,Oracle,Oracle11g,我写了这个问题我不知道为什么它对我不起作用谁能给我建议哪一个是对的 SELECT MAX(NVL(CPV.SR_NO,0)+1) INTO :CPV.SR_NO FROM CPV WHERE VOUCHER_ID=4; 我必须输入最大值,我输入0,但它不会在一条记录后为第一条记录输入1。它工作正常意味着如果表为空,则第一个条目在保存一条记录后不会给出1,而不是显示的1。即使nvl显示为null,也为0,然后为+1。请更正我 谢谢如果没有带凭证ID=4的行,那么您将在零行上取MAX,并且始终为N

我写了这个问题我不知道为什么它对我不起作用谁能给我建议哪一个是对的

SELECT MAX(NVL(CPV.SR_NO,0)+1) INTO :CPV.SR_NO FROM CPV
WHERE VOUCHER_ID=4;
我必须输入最大值,我输入0,但它不会在一条记录后为第一条记录输入1。它工作正常意味着如果表为空,则第一个条目在保存一条记录后不会给出1,而不是显示的1。即使nvl显示为null,也为0,然后为+1。请更正我
谢谢

如果没有带
凭证ID=4的行
,那么您将在零行上取
MAX
,并且始终为
NULL
-取
MAX
的表达式无关紧要。您使用的
NVL
只有在
凭证ID=4
的行时才有效,但在这些行中,
SR\u 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\u NO
,但是由于查询对您有效,我认为它是可以的编辑-我刚刚尝试过,至少在Oracle 12.2中,这样的名称对于绑定变量无效;所以我不确定你的代码怎么可能像发布的那样工作

另一次编辑

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


两个选择都不会返回任何结果。INTO子句仅在pl/sql块内有效,将引发“未找到数据”异常。@Belayer-这是错误的。由于选择的是
max(something)
,因此即使行集为空,查询也会返回一些内容。也就是说,在这种情况下,它将返回
null
。这是(唯一)完全没有
group by
子句与
group by null
不同的情况(例如,将所有行放在一个组中)。如果
按null分组
且行集为空,则
选择最大值(…)
查询将抛出
未找到数据
@Belayer-。。。但是想想你说的话,我意识到代码可以简化。由于
max(whatever)
在接管空行集(没有
groupby
子句)时返回null,因此我们可以直接在
选择中使用
NVL
。。。进入…
语句;只是不是以OP的方式尝试的,我是正确的。我猜它的蜜蜂很久以来,我遇到的那个特别的问题是忘记它的行动。
SELECT NVL( MAX(SR_NO), 0) + 1 INTO :CPV.SR_NO FROM CPV WHERE VOUCHER_ID=4;