Java JDBC ResultSet无法存储查询结果
我目前正试图通过JDBC在Oracle数据库上运行查询。我已经在SQLDeveloper中测试了我的查询,但是当我尝试在Java程序中运行查询时,我的ResultSet rs.next()结果返回false(意味着rs中没有存储任何内容) 我的代码如下:Java JDBC ResultSet无法存储查询结果,java,oracle,jdbc,resultset,Java,Oracle,Jdbc,Resultset,我目前正试图通过JDBC在Oracle数据库上运行查询。我已经在SQLDeveloper中测试了我的查询,但是当我尝试在Java程序中运行查询时,我的ResultSet rs.next()结果返回false(意味着rs中没有存储任何内容) 我的代码如下: public static void testFunction() { Properties properties = new Properties(); properties.put("user", "USERNAMEHERE
public static void testFunction() {
Properties properties = new Properties();
properties.put("user", "USERNAMEHERE");
properties.put("password", "PASSWORDHERE");
String URL = "jdbc:oracle:thin:@abc:123:def456";
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
String sqltxt = "SELECT a.MESSAGE, a.DATE, a.ID_NUM, b.MESSAGE, b.ANOTHER_ID FROM USER.SOME_TABLE_NAME a INNER JOIN USER.DIFFERENT_TABLE_NAME b on a.MESSAGE = b.MESSAGE where a.DATE= '1-December-2014' and b.ANOTHER_ID = 3 and a.ID_NUM IN(0, 100)";
try {
conn = DriverManager.getConnection(URL, properties);
stmt = conn.prepareStatement(sqltxt, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
rs = stmt.executeQuery();
System.out.println("Records exist? " + rs.next());
} catch (Exception e) {
e.printStackTrace();
} finally {
try { if (rs != null) rs.close(); } catch (Exception e) {};
try { if (stmt != null) stmt.close(); } catch (Exception e) {};
try { if (conn != null) conn.close(); } catch (Exception e) {};
}
}
我注意到,每当我向sqltxt添加WHERE子句时,rs.next()就会产生false
如果我碰巧自己找到了解决方案,我将把它张贴在这里
编辑:下面是上面相同的代码,但对sqltxt的查询不同:
public static void testFunction() {
Properties properties = new Properties();
properties.put("user", "USERNAMEHERE");
properties.put("password", "PASSWORDHERE");
String URL = "jdbc:oracle:thin:@abc:123:def456";
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
String sqltxt = "SELECT MESSAGE FROM USER.SOME_TABLE WHERE DATE = '01-December-2015'";
try {
conn = DriverManager.getConnection(URL, properties);
stmt = conn.prepareStatement(sqltxt, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
rs = stmt.executeQuery();
System.out.println("Records exist? " + rs.next());
} catch (Exception e) {
e.printStackTrace();
} finally {
try { if (rs != null) rs.close(); } catch (Exception e) {};
try { if (stmt != null) stmt.close(); } catch (Exception e) {};
try { if (conn != null) conn.close(); } catch (Exception e) {};
}
}
您应该避免在SQL文本中使用硬编码日期。尤其是对于Oracle,它需要大量的工作。以下是两个答案,一个使用硬编码日期,另一个正确利用
PreparedStatement
对象的功能:
在线日期:
public static void testFunction() {
Properties properties = new Properties();
properties.put("user", "USERNAMEHERE");
properties.put("password", "PASSWORDHERE");
String URL = "jdbc:oracle:thin:@abc:123:def456";
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
String sqltxt = "SELECT MESSAGE FROM USER.SOME_TABLE WHERE DATE = to_date('01-December-2015', 'dd-month-yyyy')";
try (Connection conn = DriverManager.getConnection(URL, properties);
PreparedStatement stmt = conn.prepareStatement(sqltxt, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stmt.executeQuery();) {
System.out.println("Records exist? " + rs.next());
} catch (Exception e) {
e.printStackTrace();
}
}
public static void testFunction() {
Properties properties = new Properties();
properties.put("user", "USERNAMEHERE");
properties.put("password", "PASSWORDHERE");
String URL = "jdbc:oracle:thin:@abc:123:def456";
String sqltxt = "SELECT MESSAGE FROM USER.SOME_TABLE WHERE DATE = ?";
try (Connection conn = DriverManager.getConnection(URL, properties);
PreparedStatement stmt = conn.prepareStatement(sqltxt, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stmt.executeQuery();) {
stmt.setDate(1, Date.valueOf(LocalDate.now().withYear(2015).withMonth(12).withDayOfMonth(1)));
System.out.println("Records exist? " + rs.next());
} catch (Exception e) {
e.printStackTrace();
}
}
(有关Oracle中硬编码日期的更多信息,请参阅)
通过参数化SQL的日期:
public static void testFunction() {
Properties properties = new Properties();
properties.put("user", "USERNAMEHERE");
properties.put("password", "PASSWORDHERE");
String URL = "jdbc:oracle:thin:@abc:123:def456";
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
String sqltxt = "SELECT MESSAGE FROM USER.SOME_TABLE WHERE DATE = to_date('01-December-2015', 'dd-month-yyyy')";
try (Connection conn = DriverManager.getConnection(URL, properties);
PreparedStatement stmt = conn.prepareStatement(sqltxt, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stmt.executeQuery();) {
System.out.println("Records exist? " + rs.next());
} catch (Exception e) {
e.printStackTrace();
}
}
public static void testFunction() {
Properties properties = new Properties();
properties.put("user", "USERNAMEHERE");
properties.put("password", "PASSWORDHERE");
String URL = "jdbc:oracle:thin:@abc:123:def456";
String sqltxt = "SELECT MESSAGE FROM USER.SOME_TABLE WHERE DATE = ?";
try (Connection conn = DriverManager.getConnection(URL, properties);
PreparedStatement stmt = conn.prepareStatement(sqltxt, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stmt.executeQuery();) {
stmt.setDate(1, Date.valueOf(LocalDate.now().withYear(2015).withMonth(12).withDayOfMonth(1)));
System.out.println("Records exist? " + rs.next());
} catch (Exception e) {
e.printStackTrace();
}
}
阅读:有关在Java中使用参数化SQL的更多信息。我将尝试注释/删除部分查询以缩小问题范围。(
a.DATE='2014年12月1日'
如果你身边有DBA,那就值得怀疑了)我添加了一个代码的替代版本,使用了一个更简单的SQL语句,它仍然会给我假消息,但我希望它有助于缩小问题:)我想问题就在这里:。。。日期='2014年12月1日'..
。将其更改为DATE=to_DATE('2014-12-01','yyyy-mm-dd')
。永远不要依赖隐式转换,它们可以在某些环境(语言设置)中工作,但在其他环境中可能会失败。请尝试使用“2015-12-01”作为日期值(另请参见:)@Abhishek查看下面的答案。非常感谢,我非常喜欢参数化SQLmethod@Abhishek一定要对每一个有价值的答案进行投票。@BasilBourque我投了赞成票,但是我还没有足够的声誉在整个网站上反映出来