web-dev-qa-db-ja.com

java挿入前にSQLのレコードの次のシーケンス番号を取得

JavaコードにTestingID変数とsql文字列があります。sql文字列は後でprepareStatementに使用されます。

 int TestingID; 

 String sqlInsert = "INSERT INTO TESTING VALUES(TESTING_SEQ.NEXTVAL, ?, ?)";  
 ...  

 MethodA(TestingID);     //passing TestingID to MethodA

新しく挿入されたレコードの次のシーケンス値をTestingIDに取得する必要があるので、上記の別のメソッドで使用できます。

9
Z.V

このアプローチを使用する場合、最初に新しいID値を照会する必要があります(シーケンスを使用しているようです)。これは、selectを発行することで実行できます。

// This example is for Oracle

String sqlIdentifier = "select TESTING_SEQ.NEXTVAL from dual";
PreparedStatement pst = conn.prepareStatement(sqlIdentifier);
synchronized( this ) {
   ResultSet rs = pst.executeQuery();
   if(rs.next())
     long myId = rs.getLong(1);

その後、preparedStatementに引数として渡します。

...
String sqlInsert = "INSERT INTO TESTING VALUES(?, ?, ?)";
PreparedStatement pst = conn.prepareStaetment(sqlInsert);
pst.setLong(1, myId);
...

その時点から、常にシーケンス番号が得られます。

これらは機能的な例ではありません(catchやfinalなどはありません)が、それを行う方法のアイデアを提供します;)

27

春とOracleデータベースでは、これが機能するはずです。

public Long getSequence() {
  org.springframework.jdbc.core.JdbcTemplate jdbcTemplateObject = new JdbcTemplate(dataSource);
  Long seq;
  String sql = "select SEQ_XY.NEXTVAL from dual";
  seq = jdbcTemplateObject.queryForObject(sql, new Object[] {}, Long.class);
  return seq;
}
2
Laszlo Lugosi

Oracleでは次を使用できます

long myId = rs.getLong("NEXTVAL");

これはHSQLでは失敗します。 「as nextval」を追加することにより、sqlステートメントを変更できます。

String sqlIdentifier = "select TESTING_SEQ.NEXTVAL as NEXTVAL from dual";
0
Walter A

以下の手順に従ってください:

                 1) create sequence in database by using the following query.
CREATE SEQUENCE sequence_name
[START WITH start_num]
[INCREMENT BY increment_num]
[ { MAXVALUE maximum_num | NOMAXVALUE } ]
[ { MINVALUE minimum_num | NOMINVALUE } ]
[ { CYCLE | NOCYCLE } ]
[ { CACHE cache_num | NOCACHE } ]
[ { ORDER | NOORDER } ];

例:

CREATE SEQUENCE customers_seq
 START WITH     1000
 INCREMENT BY   1
 NOCACHE
 NOCYCLE;

2)シーケンスが正常に作成されたかどうかを確認します。コマンドを実行することにより:

                       select * from user_sequences;

customers_seq」という名前を確認してください

3)クエリを実行します。

サンプルプログラム:

Statement stmt= connection.createStatement();

ResultSet rs = stmt.executeQuery("SELECT customers_seq.NEXTVAL FROM dual");

if ( rs!=null && rs.next() ) {
 int cust_id = rs.getInt(1);
sysout(cust_id);
rs.close();
}

stmt.close(); 
con.close();
0