2015-01-15 59 views
0

我有一个简单的SQL代码,它返回一条记录,但是当我从Java执行它时,它不返回记录的字符串部分,只有数字。这些字段是VARCHAR2,但不会被提取到我的结果集中。以下是代码。数据库连接部分已被编辑出来发布在论坛上,但它确实连接。我也附上了输出。任何指导将不胜感激,因为我在网上的搜索已经空了。 -GregJava执行语句不返回结果集中的字符串数据

package testsql; 

import java.sql.*; 

public class TestSQL { 

    String SQLtracknbr; 
    int SQLtracklength; 
    int numberOfColumns; 
    String coltypename; 
    int coldispsize; 
    String SQLschemaname; 

    public static void main(String[] args) 
     throws ClassNotFoundException, SQLException 
    { 
    Class.forName("oracle.jdbc.driver.OracleDriver"); 

    DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver()); 

     String url = "jdbc:oracle:thin:@oracam.corp.mot.com:1522:oracam"; 

     String SQLcode = "select DISTINCT tracking_number from sfc_unit_process_track where tracking_number = 'CAH15F6WW9'"; 

     System.out.println(SQLcode); 

     Connection conn = 
     DriverManager.getConnection(url,"report","report"); 

    conn.setAutoCommit(false); 
     try (Statement stmt = conn.createStatement(); ResultSet rset = stmt.executeQuery(SQLcode)) { 

      ResultSetMetaData rsmd = rset.getMetaData(); 

      while (rset.next()) { 

     int numberOfColumns = rsmd.getColumnCount(); 
     boolean b = rsmd.isSearchable(1); 
     String coltypename = rsmd.getColumnTypeName(1); 
     int coldispsize = rsmd.getColumnDisplaySize(1); 
     String SQLschemaname = rsmd.getSchemaName(1); 

     String SQLtracknbr = rset.getString(1); 
     int SQLtracklength = SQLtracknbr.length(); 

     if (SQLtracknbr == null) 
       System.out.println("NULL**********************."); 
     else 
      System.out.println("NOT NULL."); 

     System.out.println("numberOfColumns = " + numberOfColumns); 
     System.out.println("column type = " + coltypename); 
     System.out.println("column display size = " + coldispsize); 
     System.out.println("tracking_number = " + SQLtracknbr); 
     System.out.println("track number length = " + SQLtracklength); 
     System.out.println("schema name = " + SQLschemaname); 
      } 
     } 
    System.out.println ("*******End of code*******"); 
} 
} 

什么是Java中执行的结果如下:

run: 

select DISTINCT tracking_number from sfc_unit_process_track where tracking_number = 'CAH15F6WW9' 

NOT NULL. 
numberOfColumns = 1 
column type = VARCHAR2 
column display size = 30 
tracking_number = 
track number length = 0 
schema name = 
*******End of code******* 
BUILD SUCCESSFUL (total time: 0 seconds) 
+0

在猜测,也许当你在while循环中使用1,你应该使用0? – DaaaahWhoosh 2015-01-15 17:44:06

+0

如果您在SQL * Plus中以与从Java连接的用户相同的用户身份运行该查询,会发生什么情况?您是否有任何虚拟专用数据库策略?你使用什么数据库和驱动程序版本,以防万一你有一个已知的有问题的组合。 – 2015-01-15 17:57:59

+0

@DaaaahWhoosh - 1正在引用正确的列。编号从1开始,而不是零。我有另一个查询,这是一个修改,拉动更多的列和相同的问题...没有字符串返回。 – 2015-01-15 20:41:09

回答

1

这似乎是你使用,ojdbc7.jar驱动器之间的不兼容引起的,的版本你连接到的数据库,9i。

the JDBC FAQ节“有哪些不同的支持的Oracle数据库版本VS兼容JDBC版本VS JDK版本支持?”,在JDK 7/8驱动ojdbc7.jar您使用的是仅适用于Oracle 12c的支持。

Oracle通常只支持客户端/服务器两个版本(见My Oracle Support note 207303.1),而Oracle 12c和9i客户端和服务器从来都不支持。当然,JDBC略有不同,但它可能是相关的,因为驱动程序随Oracle软件一起安装。

您将不得不将数据库升级到支持的版本,或者 - 也许更实际的是在短期内 - 使用较早的驱动程序。 2013年的Wayback Machine snapshot of the JDBC FAQ表示11.2.0 JDBC驱动程序(包括ojdbc6.jarojcbd5.jar)可以与RDBMS 9.2.0进行交流。所以任何一个应该工作...