3

こんな機能があります。

    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;

選択後にシーケンスをインクリメントしたいのですが、SQLDeveloperからエラーが発生します。

"Error(194,5):PLS-00313:'NEXTVAL'はこのスコープで宣言されていません。"

これどうやってするの?

4

1 に答える 1

4

nextvalこれは、を変数に割り当てていないためです。それが何らかの説明の関数であると仮定します。.nextvalそうではなく、Oracleは実際にはそれを疑似列として説明しています。列と同じコンテキストで使用されているが、ディスクには書き込まれていないもの。

シーケンスをインクリメントする方法は、使用している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では、これがわずかに変更されたため、からの「戻り」値を.nextval変数に割り当てることもできます。

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

PLS-00313の理由は、OracleがそれSEQ1_GAKHR03がパッケージまたはその他のオブジェクトであり.nextval、このオブジェクトのサブタイプであると想定しているためです。

実際に値を使用せずにシーケンスをインクリメントすることは非常に珍しいことです。これは意図された動作ですか?

于 2012-04-13T22:52:24.783 に答える