Oracle に DATE 型の列を持つデータベース テーブルがあります。下の表のようです
表1
ID PRODUCT_NAME ITEM_CNT ENTERED_DATE
1 prod1 500 2012-07-01
2 prod2 1000 2012-06-30
私の Java コードでは、特定の日付範囲の合計 item_cnt を取得したいと考えています。ここにコードサンプルがあります
String sql = "select sum(item_cnt) from table1 where entered_date between ? and ?";
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rset = null;
try{
conn = getConnection(url, user, passwd);
pstmt = conn.prepareStatement(sql);
pstmt.setDate(1, java.sql.Date.valueOf(from_date)); //from_date is a string of "yyyy-mm-dd"
pstmt.setDate(2, java.sql.Date.valueOf(to_date)); //to_date is a string of "yyyy-mm-dd"
rset = pstmt.executeQuery();
....
}catch(SQLException e){
//do something
} finally{
//clean up
}
このコードは、3 日前までしばらくは問題なく動作していましたが、pstmt.executeQuery(); 行で次の例外が発生し始めました。
java.sql.SQLRecoverableException: No more data to read from socket
at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1157)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:290)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:207)
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:884)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1167)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1289)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3584)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3628)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1493)
答えを探してみましたが、それを本当に説明するものは見つかりませんでした。次に、SQLクエリを次のように変更しました
"select sum(item_cnt) from table1 where entered_date between to_date(?, 'yyyy-mm-dd') and to_date(?, 'yyyy-mm-dd')";
日付を設定する代わりに、準備されたステートメントを次のように変更しました
pstmt.setString(1, from_date);
pstmt.setString(2, to_date);
その後、例外はなくなりました。
もう1つの混乱は、テーブルにデータを入力するときに、まだ次のものを使用していることです
pstmt.setDate(1, java.sql.Date.valueOf(date)); //date is a string of format "yyyy-mm-dd"
そしてそれはまだ働いています。select ステートメントだけが例外を与えていました。
現在、すべてが機能していますが、その理由を本当に知りたいです。誰でも知っていますか?
最近、Java を 1.7.0_03-b05 にアップグレードしました。私はojdbc6.jarを使用しています。オラクルは11gです。これはドライバーの問題でしょうか?ojdbc7は出ていますか?