質問

次のコードが結果セットでデータを生成していない理由を理解しようとしています。

String sql = "SELECT STUDENT FROM SCHOOL WHERE SCHOOL = ? ";
PreparedStatement prepStmt = conn.prepareStatement(sql);
prepStmt.setString(1, "Waterloo");
ResultSet rs = prepStmt.executeQuery();

一方、次のことは適切に実行されます。

String sql = "SELECT STUDENT FROM SCHOOL WHERE SCHOOL = 'Waterloo' ";
PreparedStatement prepStmt = conn.prepareStatement(sql);
ResultSet rs = prepStmt.executeQuery();

学校のデータ型はchar(9バイト)です。 SetStringの代わりに、私も試みました:

String sql = "SELECT STUDENT FROM SCHOOL WHERE SCHOOL = ? ";
PreparedStatement prepStmt = conn.prepareStatement(sql);
String school = "Waterloo";
Reader reader = new CharArrayReader(school.toCharArray());
prepStmt.setCharacterStream(1, reader, 9);
prepStmt.setString(1, "Waterloo");
ResultSet rs = prepStmt.executeQuery();

私は次に何を調査するかについて完全に立ち往生しています。 Eclipse Debuggerは、SETSTRINGまたはSETCHARACTERSTREAMの後でもSQLクエリは変更されないと述べています。設定パラメーターが機能していないかどうか、またはデバッガーが準備された測定の変更を選択できないかどうかはわかりません。

どんな助けでも大歓迎です、ありがとう!

役に立ちましたか?

解決

問題は、あなたのデータタイプがchar(9)であり、「ウォータールー」が8枚しかないことだと思います。これにより、予想される結果が返されると思います(類似)。または、欠落しているスペースを追加します。

String sql = "SELECT STUDENT FROM SCHOOL WHERE SCHOOL LIKE ? ";
PreparedStatement prepStmt = conn.prepareStatement(sql);
prepStmt.setString(1, "Waterloo%");
ResultSet rs = prepStmt.executeQuery();

文字列が柔軟な長さを持っている場合、charの代わりにVarcharを使用する最良の方法です。その後、準備された測定は期待どおりに機能します。

回避策は、Oracle固有のSETFIXEDCHARメソッドを使用することです(ただし、可能であればデータ型をVarcharに変更する方が良いです)。

以下は、Oracleの準備されたJavadocからのものです。


データベース内のcharデータは、列幅にパッドでパッドされます。これにより、setChar()メソッドを使用して、文字データをSelectステートメントの句にバインドすることに制限されます。ここで、句の文字データを列の幅にパッドに入れて、Selectステートメントで一致させる必要があります。列の幅がわからない場合、これは特に面倒です。

setfixedChar()remediesこれ。このメソッドは、パッドのない比較を実行します。

ノート:

  • SetFixedChar()メソッドを使用するために、準備されたステートメントオブジェクトをOraclePreparedStatementにキャストすることを忘れないでください。
  • 挿入ステートメントにsetFixedChar()を使用する必要はありません。データベースは常に、挿入する際にデータを列幅に常に自動的にパッドします。

次の例は、SetString()、SetChar()、およびSetFixedChar()メソッドの違いを示しています。

// Schema is : create table my_table (col1 char(10));
//             insert into my_table values ('JDBC');
PreparedStatement pstmt = conn.prepareStatement
("select count() from my_table where col1 = ?");
ResultSet rs;

pstmt.setString (1, "JDBC");  // Set the Bind Value
rs = pstmt.executeQuery();    // This does not match any row
// ... do something with rs
CHAR ch = new CHAR("JDBC      ", null);
((OraclePreparedStatement)pstmt).setCHAR(1, ch); // Pad it to 10 bytes
rs = pstmt.executeQuery();     // This matches one row
// ... do something with rs
((OraclePreparedStatement)pstmt).setFixedCHAR(1, "JDBC");
rs = pstmt.executeQuery();     // This matches one row
// ... do something with rs
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top