我有一个看起来像这样的功能。
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;
我想在select之后递增序列,但是SQL Developer给了我错误:
“错误(194,5):PLS-00313:'NEXTVAL'未在此范围内声明。”
我该怎么做?
答案 0 :(得分:3)
这是因为您没有将nextval
分配给变量。 假设 .nextval
是某些描述的函数。事实并非如此,甲骨文实际上将其描述为一个伪列;在与列相同的上下文中使用但未写入磁盘的内容。
increment a sequence如何依赖于您正在使用的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中,这稍微改变了,所以你也可以分配&#34;返回&#34;从.nextval
到变量的值:
declare
l_next_val number;
begin
l_next_val := my_sequence.nextval;
end;
PLS-00313的原因是Oracle假设SEQ1_GAKHR03
是一个包或其他一些对象而.nextval
是该对象的子类型。
在没有实际使用该值的情况下递增序列是非常不寻常的。这是预期的行为吗?