Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JDBC ResultSet无法存储查询结果_Java_Oracle_Jdbc_Resultset - Fatal编程技术网

Java JDBC ResultSet无法存储查询结果

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

我目前正试图通过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) {};
    }
}

您应该避免在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我投了赞成票,但是我还没有足够的声誉在整个网站上反映出来