【发布时间】:2015-12-01 16:58:26
【问题描述】:
我目前正在尝试通过 JDBC 在 Oracle 数据库上运行查询。我已经在 SQLDeveloper 中测试了我的查询,但是当我尝试在我的 Java 程序中运行查询时,我的 ResultSet rs.next() 结果返回 false(意味着 rs 中没有存储任何内容)。
我的代码如下:
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) {};
}
}
【问题讨论】:
-
我会尝试评论/删除部分查询以缩小问题范围。 (如果你身边有一些 DBA,
a.DATE= '1-December-2014'很可疑) -
我用更简单的 SQL 语句添加了代码的替代版本,它仍然给我错误,但我希望它有助于缩小问题 :)
-
我认为问题出在:
... DATE= '1-December-2014' ....。将其更改为DATE = to_date('2014-12-01', 'yyyy-mm-dd' )。永远不要依赖隐式转换,它们可以在某些环境(语言设置)中工作,但在其他环境中可能会失败。 -
尝试使用 '2015-12-01' 作为日期值(另请参阅:docs.oracle.com/cd/E17952_01/refman-5.1-en/…)
-
@Abhishek 看看下面的答案。
标签: java oracle jdbc resultset