更新可能なJDBC ResultSet作成時の注意

JDBC2.0より,更新可能なResultSetを用いたデータ操作(更新・挿入・削除)が可能になりました。以下のように,フラグResultSet.CONCUR_UPDATABLEを使用して生成したResultSetが更新可能になります。
Statement stmt = 
connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet rs =
stmt.executeQuery("SELECT ColA, ColB FROM myTable");

ところが上記のように作成したStatementを使用しても,条件によってはResultSetが更新不能(読み取り専用)となる場合があります。

例えばOracleの場合,
stmt.executeQuery("SELECT * FROM myTable")

のようなカラム指定を行うと,フラグ指定に関わらずResultSetは読み取り専用になります。

その他,使用するデータベースによって条件があるようですので,使用時には注意が必要です。


タグ:java JDBC

CallableStatement の不思議な制限

JDBC2.0より提供されているCallableStatementクラスを使って,次のような書式でストアドプロシージャを起動することができるようになりました。
CallableStatement cs = conn.prepareCall("{? = call myProc(?,?)}")

ところで,このCallableStatementクラスの指定には,どうにも妙な記述上の制限があります。

  • "{""}"(中カッコ)を必ず付けなければならない

  • "call"は必須で,しかも小文字でなければならない


これらはドキュメントにも明記されています。

これを見落してプログラムを書くと,コール時にNullPointerException例外が飛んだり,意味の分からないエラーを受け取って頭を抱えることになります(というか,抱えました(^_^;)。

仕様であると言ってしまえば確かにその通りなのですが,どちらもあまり合理的な必要性が思いつきません。何でこんな制限が必要なんでしょうか(?_?)
タグ:java JDBC
rank← ランキングはこちらをクリック!

×

この広告は180日以上新しい記事の投稿がないブログに表示されております。