Java中的参数化Oracle SQL查询?
我一直在试图弄清楚为什么以下代码未在我的ResultSet中生成任何数据:
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();
SCHOOL的数据类型为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调试器说,即使在setString或setCharacterStream之后,SQL查询也不会更改。我不确定这是因为设置参数不起作用,还是调试器根本无法在PreparedStatement中获取更改。
任何帮助将不胜感激,谢谢!
回答:
我认为问题在于您的数据类型为CHAR(9),而“滑铁卢”只有8个字符。我认为这将返回预期的结果(LIKE和%)。或添加缺少的空间。
String sql = "SELECT STUDENT FROM SCHOOL WHERE SCHOOL LIKE ? ";PreparedStatement prepStmt = conn.prepareStatement(sql);
prepStmt.setString(1, "Waterloo%");
ResultSet rs = prepStmt.executeQuery();
如果您的字符串长度灵活,最好的方法是使用varchar而不是char。然后,PreparedStatement将按预期工作。
一种解决方法是使用Oracle特定的setFixedCHAR方法(但如果可能,最好将数据类型更改为varchar)。
以下来自Oracle的PreparedStatement JavaDoc:
数据库中的CHAR数据将填充为列宽。这导致在使用setCHAR()方法将字符数据绑定到SELECT语句的WHERE子句中受到限制-
WHERE子句中的字符数据还必须填充到列宽以在SELECT语句中产生匹配项。如果您不知道列宽,则尤其麻烦。
setFixedCHAR()对此进行了补救。此方法执行非填充比较。
笔记:
- 请记住将您准备好的语句对象转换为OraclePreparedStatement以使用setFixedCHAR()方法。
- 对于INSERT语句,无需使用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
以上是 Java中的参数化Oracle SQL查询? 的全部内容, 来源链接: utcz.com/qa/421965.html