【问题标题】:java returns empty String value for oracle VARCHAR2java为oracle VARCHAR2返回空字符串值
【发布时间】:2013-07-08 15:51:46
【问题描述】:

我的以下代码似乎可以正常工作,但它没有显示 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;
}

【问题讨论】:

  • @user2369812 您是否已验证 PERSON_CODE 具有指定徽章编号的非空数据?
  • @ThorbjørnRavnAndersen - ALL isn't a problem,它只是强制执行默认行为 - 即 not DISTINCT。冗余,确实,但有效。

标签: java oracle jdbc string varchar2


【解决方案1】:

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

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

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

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

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

祝你好运, 尼克

【讨论】:

    【解决方案2】:

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

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

    祝你好运。

    【讨论】:

      【解决方案3】:

      使用时同样的问题:

       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
      

      【讨论】:

      • 这对我有帮助 - 有没有办法在查询结果窗口中显示正确的文本,而不需要 to_clob()bing 很多文本列?
      【解决方案4】:

      我遇到了同样的问题:

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

      这样的表格: 创建表人( 名字 varchar2(60) );

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

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

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

      【讨论】:

      • 上帝保佑你!由于这个原因,我已经连续好几天撞到墙上了
      【解决方案5】:

      查看您的查询:

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

      【讨论】:

        【解决方案6】:

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

        从 BADGETABLE 中选择所有 BADGE_NUMBERPERSON_CODE ...

        【讨论】:

        • 对不起,我已经从我的代码中删除了这一行。我试图消除字段以查看问题所在。我的问题肯定与 Oracle 中的 varchar2 字段有关。它在 Java 中作为空字符串返回。
        • 在 SQL plus 中执行查询时,该列得到什么值?
        猜你喜欢
        • 1970-01-01
        • 2014-03-18
        • 2012-01-13
        • 1970-01-01
        • 1970-01-01
        • 2015-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多