実装時に遭遇したエラーについて、大小問わずメモ書きです。
随時更新できればと思います。
SQLException: ORA-03115: サポートされていないネットワークのデータ型または表現があります
executeQueryに引数を入れてました。引数を消したら解決しました。
resultSet rs = ps.executeQuery(sql); // 誤り
resultSet rs = ps.executeQuery(); // 正
java.sql.SQLException:ORA-03115:サポートされていないネットワークのデータ型または表現
Caused by: java.sql.SQLException: 転送専用の結果セットに対する操作が無効です。 : first
ORA-17075と同義?
順方向にしか移動できないカーソルに対して、next()以外のことをして発生しました。
resultSetはデフォルトでは順方向のみのようです。(ResultSet.TYPE_FORWARD_ONLYを設定した場合と同様)
順方向以外にカーソル移動をしたい場合、createStatement/prepareStatementに対して引数でカーソル種別の指定を行うことで解決できるそうです。
※私の実装環境ではスクロール可能な結果セットがサポートされておらず、上記の対応を行ってもnext以外のカーソル移動はできませんでした。
// SQL実行
resultSet rs = ps.executeQuery();
// 取得レコード数のカウント
int count = 0;
while (rs.next()){
count++;
}
// カーソルを先頭へ移動
rs.first(); // ここでエラー発生
順方向にしか進めないけどレコード数カウント後にカーソル先頭から処理を行いたい場合、以下方法になりそうです。
①カウントのwhile文内でカウント時に処理を行う。
②SQL実行を2回行い、1つをレコードカウント用、もう1つを別処理に使用。
パフォーマンス等、懸念事項はあるためどちらが良いかは仕様や目的次第かと思っています。(今回は①で回避しました。)
カーソル移動
5. ResultSetを用いた更新処理
SQLExceptioin: ResultSet.nextはコールされませんでした。
SQL実行時点では、カーソルはどこも指していないようです。
値取得を行いたい場合、next()等でカーソル指定をしないとこのエラーで落ちます。
// SQL実行
resultSet rs = ps.executeQuery();
// 実行結果から値取得
rs.getInt(1); // ここでエラー発生
// 取得レコード数のカウント
int count = 0;
while (rs.next()){
count++;
}
rs.getInt(1); // ここならOK
JAVA.SQL.SQLEXCEPTION: RESULTSET.NEXTはコールされませんでした。
.splite()が想定通りに動かない
"|"(パイプ文字)で区切りを入れた文字列をsplite()で分割しようとしましたが、正規表現の特殊文字のため想定通りに動きませんでした。
バックスラッシュを入れてエスケープしたら想定通りの挙動になりました。
// 不具合再現
String test = "hoge|fuga";
String[] list = test.splite("|");
console.log("1:" + list[0] + " 2:" + list[1]);
// 出力結果
1:h 2:o
// 修正後
String[] list = test.splite("\\|");
console.log("1:" + list[0] + " 2:" + list[1]);
// 出力結果
1:hoge 2:fuga