5

我有以下代码似乎可以正常工作,但它不显示 personCode 字符串的任何值。PERSON_CODE 是 Oracle 9i 数据库中的 VARCHAR2。

我正在为我的项目使用 Java SE 1.7 和 ojdbc7.jar。我是 Java 新手,有人可以帮我解决这个问题吗?

private static void GetEmployee(String input) {
String output = "";
Connection con=null;
PreparedStatement stmt = null;
String sql ="SELECT ALL BADGE_NUMBER, PERSON_CODE FROM BADGETABLE WHERE BADGE_NUMBER = ?";

try {
    //load driver
    Class.forName("oracle.jdbc.driver.OracleDriver");
    con=DriverManager.getConnection("jdbc:oracle:thin:username/password@host:1521:database");

    //declaring statement
    stmt = con.prepareStatement(sql);
    stmt.setString(1, input);

    // execute query
    ResultSet rows = stmt.executeQuery();

    int i = 0;
    while(rows.next()) {
        i++;
        String badgeCode = rows.getString(1);
        String personCode = rows.getString(2);
        String personType = rows.getString(3);
        System.out.println("Badge number: " + badgeCode);
        System.out.println("Employee ID: " + personCode);
    }
    System.out.println("Number of results: " + i);


    rows.close();    // All done with that resultset
    stmt.close();  // All done with that statement
    con.close();  // All done with that DB connection


}
catch (SQLException e) {
    System.err.println(e);
} 
catch (ClassNotFoundException e) {
    System.err.println(e);
}

return;
}
4

6 回答 6

4

我遇到了同样的问题:

  1. Oracle 9i 企业版 64 位(JServer 发行版 9.2.0.1.0 - 生产)
  2. JDBC 12.1.0.1.0 - ojdbc7.jar
  3. Java OpenJDK 64bit, 1.7.0_09-icedtea

使用这样的表:创建表人( first_name varchar2(60) );

并使用 sqlline 进行这样的查询: select first_name, cast(substr(first_name,0,1) as char) from person;

会有一个 ["","S"] 的结果集。

我的类路径上没有任何其他 Oracle jar,因为发现对其他人来说是个问题,但是当我从 ojdbc7.jar 切换到 ojdbc6_g.jar 时,这个问题就解决了。这是 12c 下载部分下的驱动程序版本 11.2.0.3.0。

于 2014-02-23T22:31:16.473 回答
2

看看你的查询:

String sql = "SELECT ALL BADGE_NUMBER, PERSON_CODE FROM BADGETABLE WHERE BADGE_NUMBER = ?";

下面的代码将抛出异常:

String badgeCode = rows.getString(1);
String personCode = rows.getString(2);
// there is no third column in your resultset
String personType = rows.getString(3); 

您可以将查询更改为(如果您不想使用列名):

String sql = "SELECT * FROM BADGETABLE WHERE BADGE_NUMBER = ?";

或指定第三列:

String sql = "SELECT ALL BADGE_NUMBER, PERSON_CODE ,PERSON_TYPE FROM BADGETABLE WHERE BADGE_NUMBER = ?";

并使用列名检索数据:

String badgeCode = rows.getString("BADGE_NUMBER");
String personCode = rows.getString("PERSON_CODE");
String personType = rows.getString("PERSON_TYPE");

另外,将close()语句移到finally块下:

} finally {
 try { rows.close(); } catch (Exception e) {  }
 try { stmt.close(); } catch (Exception e) {  }
 try { con.close(); } catch (Exception e) {  }
}
于 2013-07-08T15:59:44.117 回答
2

我很高兴地报告我解决了这个问题,但是,在我的代码中这是一个非常漫长而痛苦的搜索,而事实上,问题实际上是在我的 Glassfish 服务器中。

我在这个网站的某个地方读到有人遇到了类似的问题,他们已经删除了一些具有以下名称的 jar: ojdbc18???.jar 。当我搜索这个时,我没有找到任何东西,所以我继续前进。

拔掉大部分头发后,我决定开始在网络服务器上四处浏览,果然,WEB-SERVER 的 lib 目录中还有其他jar,这些 jar 对我的应用程序是可见的。

那些罐子是 ojdbc14???.jar。彻头彻尾的怪胎。一旦我删除了那些 ojdbc14,一切正常。

为此,请搜索您的类路径并确保找不到类似的 jar。

祝你好运,尼克

于 2013-08-14T14:50:26.467 回答
2

使用时同样的问题:

 Oracle 9i Enterprise Edition 64bit 9.2.0.8.0 - on Sun Server Sun OS 10.
    JDBC 12.1.0.2.0 - ojdbc7.jar (thin driver)
    manifest info: Created-By: 20.75-b01 (Sun Microsystems Inc.)  
Implementation Vendor: Oracle Corporation Implementation-Version: 12.1.0.2.0

对我来说帮助了这个解决方案,它不是最好的,但它有效:

select to_clob(field_name) as field_name from table_name

此外,如果您确定字段的长度,此解决方案可能会有所帮助:

  select cast(field_name as char(10)) as field_name from table_name
于 2015-12-15T10:01:35.450 回答
1

问题是 ojdbc8.jar 驱动程序和 Oracle 9i 之间鲜为人知的不兼容问题。用ojdbc6.jar替换驱动ojdbc8.jar,问题就解决了。我在使用 Weblogic12 时遇到了同样的问题。我不得不替换 Weblogic12 中的驱动程序来创建数据源。这是一个显示问题的小测试链接:

https://github.com/paulog29/jdbc-oracle9i

祝你好运。

于 2021-03-26T13:31:42.337 回答
0

忽略allSQL 中的 ,您的基本问题是您尝试获取 3 个字段,而您的 sql 查询仅选择 2 :

从 BADGETABLE 中选择所有BADGE_NUMBERPERSON_CODE ...

于 2013-07-08T16:00:24.453 回答