Каков правильный синтаксис для увеличения последовательности?

У меня есть функция, которая выглядит так.

Function GetNewBatch ( CourseName Varchar2 ) Return RefCursor
 As
 Results RefCursor;
 CourseId Number;
 Begin
 CourseId := Courselist.GetId( CourseName );
 Open Results For 
 Select q.user_abn UserAbn,
 q.completed_t DateCompleted,
 CourseName,
 q.batch_n BatchId
 From GAK.GAKHR02_ACK q
 Where q.crse_i = CourseId
 And q.batch_n is null
 And rownum < 1000;
 GAK.SEQ1_GAKHR03.NextVal;
 Return Results;
 End;

Я хочу увеличить последовательность после выбора, но SQL Developer дает мне ошибку:

"Ошибка (194,5): PLS-00313: 'NEXTVAL' не объявлен в этой области."

Как я могу это сделать?

1 ответ

Это потому, что вы не присваиваете переменной nextval переменной. Предположим, что .nextval является функцией некоторого описания. Это не так, Oracle на самом деле описывает это как psuedocolumn; что-то используется в том же контексте, что и столбец, но не записывается на диск.

Как вы увеличивать последовательность зависит от версии используемого вами Oracle. До 11G вы можете сделать следующее в блоке PL/SQL:

declare 
 i number; 
begin
 select my_sequence.nextval
 into i
 from dual;
 insert into my_table(id)
 values(my_sequence.nextval);
 update my_table
 set id = my_sequence.nextval;
end;

В 11G это немного изменилось, чтобы вы могли также присвоить значение "return" от .nextval к переменной:

declare
 l_next_val number;
begin
 l_next_val := my_sequence.nextval;
end;

Причиной для PLS-00313 является то, что Oracle предполагает, что SEQ1_GAKHR03 является пакетом или другим объектом, а .nextval является подтипом этого объекта.

Очень необычно увеличивать последовательность без фактического использования значения. Это предполагаемое поведение?

licensed under cc by-sa 3.0 with attribution.