1

大きな問題があります。オラクル シーケンスの次の値を変更せずに知る必要があります。

を使用するsequence.NEXTVALと、必要なものが得られます。問題は、値が変更されたため、次のレコードはこの値 + 1 になり、私にとっては良くありません。

私は使用できることを知ってsequence.CURRVALおり、値を変更しないので素晴らしいですが、レコードがない場合は機能せず、この場合、シーケンス値は任意の数になる可能性があります (シーケンス値のスチールが存在する原因は 1 つだけではありません)。

解決策を見つけるのを手伝ってください。

ありがとうございます!

4

5 に答える 5

3

連続した番号付けよりも同時実行性を最適化するため、シーケンス内の値が決して失われないことに頼るべきではありません。数字が「失われる」可能性がある状況はかなりあります。

さらに、番号はメモリ内キャッシュから割り当てられるため、dba_sequences に表示される値は実際の次の値ではない場合があります。基になるシーケンス メタデータ テーブルには、そのキャッシュの使用状況に関するデータがありません。また、RAC システムでは、各インスタンスが独自のシーケンス番号のキャッシュを持っていることにも注意してください。

シーケンスが適切なメカニズムではない可能性があるため、解決しようとしている問題について説明する場合があります。

于 2014-01-13T14:32:06.390 に答える
1

マルチユーザー環境では仕方がありません。値は、呼び出し時.NEXTVALまたは不明のいずれかです。シーケンスはロックできません。

于 2014-01-13T14:37:29.483 に答える
0

シーケンスの次の値を知りたい理由がわかりません。値の唯一の重要性は、それを新しいレコードに使用した場合です。したがって、新しいレコードを作成してすぐに ID 値を返します。

declare
  l_id number;
begin
   Insert into table (id) 
   values (sequence.nextval) 
   return id into l_id;

   -- and then do something more with the ID value
end;

または、最初に新しい ID を取得し、後でそれを使用します

declare   
   l_id number; 
begin
   select sequence.nextval    
   into l_id    
   from dual;

    -- then do something with the ID value 
end;
于 2014-01-13T14:59:36.150 に答える
0

私があなたにできる唯一の提案は、 nextval を取得してから元に戻すことです。ただし、注意: これらの操作は、シーケンスが他のセッションから使用されていないときにのみ実行してください。そうしないと、この操作中にシーケンスが別のセッションから取得された場合、元の値に戻せなくなる可能性があります。したがって、チェックする前に注意してください。

私のデータベースでは、seq_test の現在の値は 6 です

-- 次の値を取得します

SQL> SELECT seq_test.NEXTVAL FROM dual;

   NEXTVAL
----------
         7

-- わかりました。これが次の値です。元に戻す

SQL> ALTER SEQUENCE seq_test INCREMENT BY -1;

Sequence altered.

SQL> SELECT seq_test.NEXTVAL FROM dual;

   NEXTVAL
----------
         6

-- 元のインクリメント バイ 句を復元します

SQL> ALTER SEQUENCE seq_test INCREMENT BY 1;

Sequence altered.

- 小切手

SQL> SELECT seq_test.CURRVAL FROM dual;

   CURRVAL
----------
         6

これは致命的である可能性があることを再度警告します;-)

于 2014-01-13T15:54:13.977 に答える
0

の「last_number」列を見てください

select * from USER_SEQUENCES

編集:

これは、シーケンスが nocache オプションで作成された場合にのみ機能します。

したがって、シーケンスにキャッシュ設定がある場合は、それを削除して nocache で再作成してから、user_sequences.last_number +1 を使用できます。

シーケンスが頻繁に使用される場合、これはパフォーマンスに影響を与えることに注意してください。逆に、シーケンスをあまり使わないのであれば問題ありません。

アプリケーションを作成すること (これが最善の解決策です) を除けば、これが唯一の解決策です。

于 2014-01-13T14:30:08.520 に答える