Search code examples
javaoracle-databasejdbcresultset

JDBC ResultSet fails to store query results


I am currently trying to run a query on an Oracle database through the JDBC. I have tested my queries in SQLDeveloper, but when I try to run the queries within my Java program, my ResultSet rs.next() result returns false (meaning there isn't anything stored in rs).

My code is below:

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) {};
    }
}

I have noticed that whenever I add a WHERE clause to sqltxt, that is when my rs.next() yields false.

Any insight is appreciated, if I happen to find the solution myself, I will post it here.

EDIT: Here is the same code from above BUT with a different query for 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) {};
    }
}

Solution

  • You should avoid hard-coded dates in your SQL text. Especially with Oracle, it requires a lot of work. Here are two answers, one using a hard-coded date, another which properly utilizes the power of your PreparedStatement object:

    Date in-line:

    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();
        }
    }
    

    (see: http://www.techonthenet.com/oracle/functions/to_date.php for more information about hard-coding dates in Oracle)

    Date through the Parameterized 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";
        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();
        }
    }
    

    read: http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html for more information about using Parameterized SQL in Java.