java为oracle VARCHAR2返回空字符串值

java为oracle VARCHAR2返回空字符串值,java,oracle,jdbc,string,varchar2,Java,Oracle,Jdbc,String,Varchar2,我有下面的代码,它似乎工作正常,但它没有显示personCode字符串的任何值。PERSON_代码是Oracle 9i数据库中的VARCHAR2 我在项目中使用JavaSE1.7和ojdbc7.jar。我是Java新手,有人能帮我吗 private static void GetEmployee(String input) { String output = ""; Connection con=null; PreparedStatement stmt = null; String sql ="

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

我在项目中使用JavaSE1.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;
}
查看您的查询:

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

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


从BADGETABLE中选择所有徽章编号个人代码

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

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

拔出大部分头发后,我决定开始在WEB服务器上浏览,果然,WEB服务器的lib dir中还有其他jar,我的应用程序可以看到这些jar

那些罐子是ojdbc14???.jar。完全是怪胎。一旦我删除了那些ojdbc14,一切都很好

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

祝你好运,
Nick

我在使用时遇到了同样的问题:

  • Oracle 9i企业版64位(JServer Rlease 9.2.0.1.0-生产版)
  • JDBC12.1.0.1.0-ojdbc7.jar
  • Java OpenJDK 64位,1.7.0_09-icedtea
  • 有这样一张桌子: 创建表格人员( 名字varchar2(60) );

    并使用sqlline进行如下查询: 从person中选择first_name,cast(substr(first_name,0,1)作为char)

    结果集为[“”,“S”]


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

     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
    

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


    祝您好运。

    @user2369812您是否验证了PERSON_代码具有给定徽章号码的非空数据?@ThorbjørnRavnAndersen-,它只是强制执行默认行为-即不区分。多余的,真的,但有效。很抱歉造成混淆,但我已经从代码中删除了这一行。我试图消除字段以查看问题所在。我的问题肯定是Oracle中的varchar2字段。它在Java中以空字符串的形式返回。当您在SQL plus中执行查询时,该列的值是多少?上帝保佑您!因为这对我来说很有帮助-有没有一种方法可以在查询结果窗口中显示正确的文本,而不必关闭许多文本列?
      select cast(field_name as char(10)) as field_name from table_name