我创建了一个这样的序列:
CREATE SEQUENCE seq_test2
MINVALUE 0
MAXVALUE 999999999999999999999999999
START WITH 0
INCREMENT BY 1;
这两个查询都向我显示数字 0:
select SEQ_TEST2.nextval from DUAL;
select SEQ_TEST2.currval from DUAL;
我有一张桌子,你可以在这里看到:
create table STUDENT
(
st_id NUMBER,
first_name VARCHAR2(150),
last_name VARCHAR2(150)
)
执行下面的查询后,
select t.st_id , nvl(t.st_id , seq_test2.nextval) as seq
from STUDENT t
当 column 中没有 null 时st_id
,我得到的结果是:
st_id seq
---------------
1 1
2 2
3 3
4 4
5 5
当我插入列为空的行时st_id
,执行上面的查询后,结果如下:
st_id seq
---------------
1 1
2 2
3 3
4 4
5 5
null 10
如果我再次执行它,我会看到:
st_id seq
---------------
1 1
2 2
3 3
4 4
5 5
null 16
好像即使列st_id
有数据,这部分NVL function
(seq_test2.nextval) 也会被执行!!!为什么会这样?
提前致谢
没错,但这不是 Pantea 在这里描述的行为的原因。
NEXTVAL
对and的引用CURRVAL
不是函数,而是伪列。无论您是否使用nvl
orcoalesce
(或case
ordecode
),sequence.nextval
都将始终针对每个获取的行进行评估,并且序列值将会增长。NVL
不会短路,因此即使第一个输入不为空,也会评估第二个参数。COALESCE
确实使用短路评估。--edit 不过没关系,看看 Andi Schloegl 的回答