java代码和oracle db服务器上查询的不同结果:但没有连接错误

ber*_*436 3 java oracle

我有连接到远程 oracle 11g EE db 服务器的 java 代码。如果我在 sqlplus 中运行特定查询,它会返回一个结果

SQL> SELECT COURSENAME from COURSES where skillID=1;

COURSENAME
--------------------
basic
Run Code Online (Sandbox Code Playgroud)

但是,如果我从下面的 java 代码运行相同的查询,它不会返回任何结果。我可以从queryjava 调试器中的变量中复制查询语法并在 oracle 上运行它,所以我知道查询没有语法问题。此外,它不是 SQL 异常或未找到类的异常,因此它似乎成功运行了查询——只是返回零结果。

可能会发生什么?

    private String getCourseForSkill(int skillID){
    try{
        Class.forName("oracle.jdbc.OracleDriver"); 
        String query="SELECT COURSENAME from COURSES where skillID=" + skillID ; 
        con = DriverManager.getConnection(url, user, password);
        Statement stmt = con.createStatement();
        rs = stmt.executeQuery(query);
        rs.next();
        return rs.getString("COURSENAME");
    }
    catch (ClassNotFoundException ex){
        System.out.println(ex.getMessage());
    }
    catch (SQLException ex) {
         System.out.println(ex.getMessage());
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

Gle*_*est 5

  1. 我认为您正在连接到不同的 Oracle 实例,或者更有可能是在两种情况下作为不同的 Oracle 用户

    @GreyBeardedGeek 该 URL 看起来像“jdbc:oracle:thin:@website:port:orcl 我通过执行 ssh@website、身份验证然后运行 ​​command=sqlplus 来手动查询

    运行更安全sqlplus <username>/<password>@<orainstancename>,因为您可以明确指定 oracle 实例 ID。在您的情况下,您的程序似乎正在使用 jdbc 连接jdbc:oracle:thin:@website:port:orcl,因此您的 orainstancename 将是“ orcl ” - 只需确保您的tnsnames.ora文件具有与jdbc 连接使用的“端口”相同的实例“ orcl

  2. 如何调试多一点

    运行以下代码:

    con = DriverManager.getConnection(url, user, password);
    con.setAutoCommit(false);
    String insert="INSERT INTO COURSES (SKILLID, COURSE)"+ // can add other columns
                 "values (?, ?) );"                       // add ? for other columns    
    PreparedStatement ps = con.createPreparedStatement();
    ps.setInt(1, 999);
    ps.setString(2, "Complete Bullwarks");
    // can set other columns
    ps.executeUpdate(insert);
    con.commit();
    
    Run Code Online (Sandbox Code Playgroud)

    现在手动连接,重新运行您的原始选择语句并查看添加的行是否存在。如果 java 中没有错误并且 Oracle 中没有新行:极有可能您正在使用 2 个不同的 Oracle 实例/模式。

    还要重新运行您的原始 java 选择代码,但使用 SkillID=999 - 极有可能它会起作用。

干杯