什么是正确的语法来增加序列?

时间:2012-04-13 22:42:04

标签: oracle plsql

我有一个看起来像这样的功能。

    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'未在此范围内声明。”

我该怎么做?

1 个答案:

答案 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是该对象的子类型。

在没有实际使用该值的情况下递增序列是非常不寻常的。这是预期的行为吗?

相关问题