検索
カレンダー
2019年9月
« 4月    
1234567
891011121314
15161718192021
22232425262728
2930  
ブログメニュー
Amazon検索
キーワード:

今更ながらOracleの自動採番について調べて(ハマって)みた

2012年12月16日

ご無沙汰しております。

最近Oracleを少し触ってみて自動採番でハマったところがあったのでメモ。

自動採番と言えば、
MySQLではAUTO_INCREMENT属性、
PostgreSQLではSERIAL型、
SQL ServerではIDENTITY属性と、
DBMSによって色々な実装がありますが、
Oracleでは(ある意味PostgreSQLでも)自動採番にシーケンスを使うことになります。

しかし、そうするとINSERT文にNEXTVALみたいな独自の関数を記述しないといけないので、
ちょっと気持ち悪いのです(僕だけ?)。

そこで、他のDBMSと同様に値を指定しない場合は自動採番するよう、
Archive Redo Blog さんの記事を参考にしてトリガを作成することにしました。

これはこれで解決したのですが、次の問題が!

それは、PreparedStatement#getGeneratedKeys() で
自動採番した値が取れないというものです。

これについては色々調べまくってRETURNINGを使えばいいとか、
ストアド・プロシージャを使えばいいとかいう情報も掴んだのですが、とりあえずこれらは却下。

最終的には、Connection#prepareStatement(String sql, int autoGeneratedKeys) メソッドではなく、
Connection#prepareStatement(String sql, String[] columnNames) メソッドを使うだけで取れることがわかりました。

先述のトリガを使ってても問題ないぽいです。
内部的にはどういうSQLが実行されているのか知らないですが…。

参考:
Thread: Why does getGeneratedKeys return a ROWID with no numeric value?

bjhartinさんに感謝!

コメントはまだありません »

コメントはまだありません。

TrackBack URL : http://www.meibinlab.jp/nishijima/archives/142/trackback

コメントする