Eu criei uma sequência assim:
CREATE SEQUENCE seq_test2
MINVALUE 0
MAXVALUE 999999999999999999999999999
START WITH 0
INCREMENT BY 1;
Ambas as duas consultas me mostram o número 0:
select SEQ_TEST2.nextval from DUAL;
select SEQ_TEST2.currval from DUAL;
E eu tenho uma tabela como você pode ver aqui:
create table STUDENT
(
st_id NUMBER,
first_name VARCHAR2(150),
last_name VARCHAR2(150)
)
Após executar a consulta abaixo,
select t.st_id , nvl(t.st_id , seq_test2.nextval) as seq
from STUDENT t
Quando não há null na st_id
coluna, o resultado que recebo é este:
st_id seq
---------------
1 1
2 2
3 3
4 4
5 5
quando insiro uma linha para a qual a coluna st_id
é null , após executar a consulta acima o resultado é como abaixo:
st_id seq
---------------
1 1
2 2
3 3
4 4
5 5
null 10
E se eu executá-lo novamente, vejo:
st_id seq
---------------
1 1
2 2
3 3
4 4
5 5
null 16
Parece que mesmo que a coluna st_id
tenha data , esta parte do NVL function
(seq_test2.nextval) é executada !!!! Por que isso está acontecendo?
desde já, obrigado
É verdade, mas essa não é a razão do comportamento que Pantea descreveu aqui. Referências a
NEXTVAL
eCURRVAL
não são funções, mas pseudocolunas . Não importa se você usanvl
oucoalesce
(oucase
oudecode
),sequence.nextval
sempre será avaliado para cada linha buscada e o valor da sequência crescerá.NVL
não causa curto-circuito, portanto, mesmo quando a primeira entrada não é nula, o segundo argumento é avaliado.COALESCE
usa avaliação de curto-circuito .--edit Mas isso não importa, veja a resposta de Andi Schloegl