JavaコードにTestingID
変数とsql文字列があります。sql文字列は後でprepareStatement
に使用されます。
int TestingID;
String sqlInsert = "INSERT INTO TESTING VALUES(TESTING_SEQ.NEXTVAL, ?, ?)";
...
MethodA(TestingID); //passing TestingID to MethodA
新しく挿入されたレコードの次のシーケンス値をTestingID
に取得する必要があるので、上記の別のメソッドで使用できます。
このアプローチを使用する場合、最初に新しい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などはありません)が、それを行う方法のアイデアを提供します;)
春と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;
}
Oracleでは次を使用できます
long myId = rs.getLong("NEXTVAL");
これはHSQLでは失敗します。 「as nextval」を追加することにより、sqlステートメントを変更できます。
String sqlIdentifier = "select TESTING_SEQ.NEXTVAL as NEXTVAL from dual";
以下の手順に従ってください:
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();