さて、続きです。
java.sql.Statementクラスには、INSERT文にて自動生成されたキーを取得するためのAPIが提供されています。それが表題のStatement#getGeneratedKeys()メソッドです。このメソッドの返り値はjava.sql.ResultSetのインスタンスになっており、そこからキーを取得できるという訳です。
MySQLならResultSet#getIntでキーを取得できます。シンプルでいいですね。ところが、Oracleだとそう単純にはいきません。同様にgetInt()すると、メモリの位置っぽい感じの謎な数字が返ってきます。getInt()ではなくgetObject()で取得して確認してみると、oracle.jdbc.ROWIDなるクラスのオブジェクトであることが分かります。
このROWID、擬似的なカラムと言いますか、ポインタと言っていいと思います。このポインタがINSERT文で生成されたカラムを差しており、コレに対してSELECT文を投げることでようやく求めるキーが得られるという訳です。
» 続きを読む
MySQLには、新しいレコードをinsertする度にIDを自動生成してくれるauto_incrementというカラム属性があります。PostgreSQLではserialを利用できるようです。が、Oracleにはこれらの機能がありません。しかし、sequenceとtriggerを用いて擬似的にauto_incrementを実現することができます。
ここまでならwebにある情報で何とかなります。んでは次に、この生成されたID取得するにはどうすればよいか。MySQLならAPI経由で取得する方法がありますが、JDBC経由のOracleならどうでしょう? insertしたカラムをselectする? いえいえ、もっと楽な方法があるのです。
ということで次回に続きます。
