我有连接到远程 oracle 11g EE db 服务器的 java 代码。如果我在 sqlplus 中运行特定查询,它会返回一个结果
SQL> SELECT COURSENAME from COURSES where skillID=1;
COURSENAME
--------------------
basic
Run Code Online (Sandbox Code Playgroud)
但是,如果我从下面的 java 代码运行相同的查询,它不会返回任何结果。我可以从query
java 调试器中的变量中复制查询语法并在 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)
我认为您正在连接到不同的 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 ”
如何调试多一点
运行以下代码:
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 - 极有可能它会起作用。
干杯
归档时间: |
|
查看次数: |
3230 次 |
最近记录: |