私はシーケンスを使用して私のIDを生成していますが、私はそのシーケンスをJavaアプリケーションから使います。たとえば、私の最後のIdは200です。Oracle Sequences
seq.nextvalを実行する代わりにidとして201を使用して.sqlを使ってエントリを追加するとします。 Javaアプリケーションがseq.nextvalを呼び出すとどうなりますか?利用可能な最大数をチェックするのに十分なほどスマートなシーケンスか、それとも201を返しますか?
私はシーケンスを使用して私のIDを生成していますが、私はそのシーケンスをJavaアプリケーションから使います。たとえば、私の最後のIdは200です。Oracle Sequences
seq.nextvalを実行する代わりにidとして201を使用して.sqlを使ってエントリを追加するとします。 Javaアプリケーションがseq.nextvalを呼び出すとどうなりますか?利用可能な最大数をチェックするのに十分なほどスマートなシーケンスか、それとも201を返しますか?
数字は何のために使用されているかわからないので、201に戻ります。
注:シーケンスは、いくつかのセッションの値をキャッシュする必要があることを指定した場合には、たとえば、220を返すことがあります(詳細についてはOracle manual about CREATE SEQUENCEを参照)
シーケンスだけでその番号を「選択」する方法を提供します自動増加。
何もチェックしないので、取得された最後の値が格納され、再度クエリするとシーケンスの次の値が返されるため、201が表示されます。
それはあなたがまた、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
何戻り、多くの要因に依存します:クラスタ環境で実行する場合は、次に話すどのノード、
シーケンスはゆるやかに順序付けされており、絶対順序はありません。
しかし、Oracleは配列値を使って何をするのかわからないので、データベースに201を挿入すると、配列は基本的には無関係なので、挿入された値を完全に無視してうれしく201を返します。
シーケンス生成値と手動挿入文字を混ぜることは、すべてが混ざり合ってしまうため、決してお勧めできません。
あなたの状況に役立つかどうかは不明ですが、シーケンスの現在の値(seq.currvalなどで)を尋ねることができますので、手動で挿入されているためにテーブルに既に存在するかどうかを確認できます必要に応じて別のnextvalを要求してください
最初にNEXTVALを呼び出さない限り、CURRVALはエラーを発生させます。 –