- PR -

Postgres挿入時のserial値の取得

1
投稿者投稿内容
Dream
常連さん
会議室デビュー日: 2004/01/29
投稿数: 43
投稿日時: 2009-02-02 20:43
Postgre8.2 Java1.5で開発をしています。

テーブルに値を挿入したときに、select currval(serial_col) というような
クエリーや8.2以降であればreturning句を使えば、serialカラムの値が挿入と
同時に取得できるということは調べたのですが、具体的にソースにおとすときに
は、どのように書いたらいいのか分からず困っております。

テーブルは
CREATE TABLE user_
(
user_id serial NOT NULL,
user_name character varying(100),
login_name character varying(50),
pswd bytea
)
というようなテーブルで、

以下のような形でSQL文を組み立てて実行してみたのですがうまくいきません。
どこか参考になるようなサイト等を教えていただければ幸いです。
よろしくお願いいたします。


String query = "insert into user_ (user_name) values('test') returning (user_id)";
PreparedStatement pstmt = con.prepareStatement(query,PreparedStatement.RETURN_GENERATED_KEYS);
int test = pstmt.executeUpdate();
rs = pstmt.getGeneratedKeys();
while(rs.next()){
System.out.println(rs.getInt(1));
}
sawat
大ベテラン
会議室デビュー日: 2006/08/02
投稿数: 112
投稿日時: 2009-02-03 10:50
やったことがあるわけじゃないので、推測ですが
SQLの実行結果として値が帰るのであれば
ps.executeQuery()を使えばいいのではないでしょうか?
逆にこれがダメだとJDBCでは扱えないのではないかと思います。
冬寂
ぬし
会議室デビュー日: 2002/09/17
投稿数: 449
投稿日時: 2009-02-03 13:35
currval()以外にも、nextval()という関数があるので、それを使用する感じになるのではないかと思います。

# が、ものによって、もしくはデータベースドライバなどによって、インサートしたidを勝手に取得して返したりする関数が実装されてたりする場合があったような・・・
ちょま吉
大ベテラン
会議室デビュー日: 2004/08/04
投稿数: 112
投稿日時: 2009-02-03 23:37
returningを使うのであれば、sawat様のおっしゃるとおりexecuteQuery()してResultSetを取得すれば良いように思います。(私は使ったことありません)
下のURLはreturningの解説みたいです。
http://www.hoge256.net/2008/04/120.html

また、nextval()でinsertしてcurrval()で取り出す方法もあります。(これは使ったことあります)
この方法ですと2本のSQLを発行することになります。
たしか、同一トランザクション内でなければ駄目だったような気もします。
下記参考URLです。
http://blog.ozacc.com/archives/001613.html

ご参考になれば幸いです。
Dream
常連さん
会議室デビュー日: 2004/01/29
投稿数: 43
投稿日時: 2009-02-04 19:05
ご回答ありがとうございました。

ご指摘の通り、executeQuery()を使ってResultSetを取得することにより、目的のserial値を取り出すことができました。
ご参考までに、ソースは

String query = "insert into user_ (user_name) values('abc') returning(user_id)";

getConnection2Postgres();
try {
PreparedStatement pstmt = con.prepareStatement(query);
ResultSet rs = pstmt.executeQuery();
while(rs.next()){
System.out.println(rs.getInt(1)); ← serial_idを取得
}
catch(SQLException e){
e.printStackTrace();
}

です。
1

スキルアップ/キャリアアップ(JOB@IT)