2009-05-10 1 views
3

私はシーケンスを使用して私のIDを生成していますが、私はそのシーケンスをJavaアプリケーションから使います。たとえば、私の最後のIdは200です。Oracle Sequences

seq.nextvalを実行する代わりにidとして201を使用して.sqlを使ってエントリを追加するとします。 Javaアプリケーションがseq.nextvalを呼び出すとどうなりますか?利用可能な最大数をチェックするのに十分なほどスマートなシーケンスか、それとも201を返しますか?

答えて

3

数字は何のために使用されているかわからないので、201に戻ります。

注:シーケンスは、いくつかのセッションの値をキャッシュする必要があることを指定した場合には、たとえば、220を返すことがあります(詳細についてはOracle manual about CREATE SEQUENCEを参照)

2

シーケンスだけでその番号を「選択」する方法を提供します自動増加。

何もチェックしないので、取得された最後の値が格納され、再度クエリするとシーケンスの次の値が返されるため、201が表示されます。

0

それはあなたがまた、JDBCからNEXTVALを使用して、挿入を行うには、その値を使用することができます201

返します。

Statement st = conn.createStatement(); 
ResultSet rs = st.executeQuery("select seq.nextval from dual"); 
rs.next(); 
int yourId = rs.getInt(1); 

// then use yourId to do the insert 

あなたが番号を使用して挿入し、また維持することができます。この道をシーケンスはそれがすべきである方法です。あなたのJavaアプリからの次の呼び出しでのnextval

0

何戻り、多くの要因に依存します:クラスタ環境で実行する場合は、次に話すどのノード、

  1. 。各ノードはシーケンス値のプールを事前に割り当てます。
  2. あなたが話しているノードが再起動されているかどうか。これが起きた場合、シーケンス値のプールは "失われる"(スキップされたことを意味する)傾向があります。
  3. シーケンスのステップ値。
  4. トランザクションがシーケンスでnextvalを呼び出すかどうか。

シーケンスはゆるやかに順序付けされており、絶対順序はありません。

しかし、Oracleは配列値を使って何をするのかわからないので、データベースに201を挿入すると、配列は基本的には無関係なので、挿入された値を完全に無視してうれしく201を返します。

0

シーケンス生成値と手動挿入文字を混ぜることは、すべてが混ざり合ってしまうため、決してお勧めできません。

あなたの状況に役立つかどうかは不明ですが、シーケンスの現在の値(seq.currvalなどで)を尋ねることができますので、手動で挿入されているためにテーブルに既に存在するかどうかを確認できます必要に応じて別のnextvalを要求してください

+0

最初にNEXTVALを呼び出さない限り、CURRVALはエラーを発生させます。 –