在常规SQL中,每次调用 .NEXTVAL
时,我的序列都会递增:
SELECT PDF_DATOS_TITULO_ID_SEQ.CURRVAL FROM DUAL; -- 54
SELECT PDF_DATOS_TITULO_ID_SEQ.NEXTVAL FROM DUAL; -- 55
SELECT PDF_DATOS_TITULO_ID_SEQ.NEXTVAL FROM DUAL; -- 56
SELECT PDF_DATOS_TITULO_ID_SEQ.NEXTVAL FROM DUAL; -- 57
SELECT PDF_DATOS_TITULO_ID_SEQ.CURRVAL FROM DUAL; -- 57 (54+3, correct)
但是,在PL / SQL块内的动态SQL中,它不会增加:
SELECT PDF_DATOS_TITULO_ID_SEQ.CURRVAL FROM DUAL; -- 57
BEGIN
EXECUTE IMMEDIATE 'SELECT PDF_DATOS_TITULO_ID_SEQ.NEXTVAL FROM DUAL';
EXECUTE IMMEDIATE 'SELECT PDF_DATOS_TITULO_ID_SEQ.NEXTVAL FROM DUAL';
EXECUTE IMMEDIATE 'SELECT PDF_DATOS_TITULO_ID_SEQ.NEXTVAL FROM DUAL';
END;
/
SELECT PDF_DATOS_TITULO_ID_SEQ.CURRVAL FROM DUAL; -- 57
...除非我将值存储到变量中:
SELECT PDF_DATOS_TITULO_ID_SEQ.CURRVAL FROM DUAL; -- 57 (!)
DECLARE
FOO INTEGER;
BEGIN
EXECUTE IMMEDIATE 'SELECT PDF_DATOS_TITULO_ID_SEQ.NEXTVAL FROM DUAL' INTO FOO;
EXECUTE IMMEDIATE 'SELECT PDF_DATOS_TITULO_ID_SEQ.NEXTVAL FROM DUAL' INTO FOO;
EXECUTE IMMEDIATE 'SELECT PDF_DATOS_TITULO_ID_SEQ.NEXTVAL FROM DUAL' INTO FOO;
END;
/
SELECT PDF_DATOS_TITULO_ID_SEQ.CURRVAL FROM DUAL; -- 60 (57+3, correct)
解释是什么?它是 EXECUTE IMMEDIATE
的记录行为吗?
在您提出要求之前,SQL需要是动态的,因为序列名称是可变的 .
1 回答
当你省略或批量返回子句时,Oracle只会解析sql但不会从中发出任何提取 . 在文档中没有明确说明会发生这种情况,但是文档确实指定当你有1行返回时你应该使用INTO,如果你有可能有多行返回,那么你应该使用INTO .
例如 . :
我们在跟踪中看到Oracle没有对FETCH阶段感到困扰:
VS:
现在:
可以看到FETCH . 我认为理想情况下,Oracle应该在用户发出没有定义INTO / BULK INTO的select的情况下抛出错误 .