2009-04-10 7 views
0

Je travaille sur un projet en oracle 9i. J'avais un problème avec toplink 10.1.3 charger une ligne particulière dans une table. Il s'avère que le pilote jdbc sur lequel toplink s'appuie est très amusant. Peut-être que quelqu'un ici peut aider ...Quand deux colonnes qui se ressemblent ne sont-elles pas les mêmes en oracle?

J'ai une table nommée: crazytable. Il a une colonne: "ver_num number (19) not null default 0". Cette colonne a été ajoutée à la table dans le cadre de l'insertion originale il y a quelques années. Lorsque je sélectionne un enregistrement (voir ci-dessous pour le code de connexion jdbc) de crazytable et que je tente de faire un rs.getLong (colIndex), tout fonctionne correctement. Cependant, si je fais un rs.getObject (colIndex), je reçois un stacktrace:

java.lang.ArrayIndexOutOfBoundsException: 1 
    at oracle.sql.NUMBER.toBigDecimal(NUMBER.java:651) 
    at oracle.jdbc.dbaccess.DBConversion.NumberBytesToBigDecimal(DBConversion.java:2805) 
    at oracle.jdbc.driver.OracleStatement.getBigDecimalValue(OracleStatement.java:4539) 
    at oracle.jdbc.driver.OracleStatement.getObjectValue(OracleStatement.java:5666) 
    at oracle.jdbc.driver.OracleStatement.getObjectValue(OracleStatement.java:5622) 
    at oracle.jdbc.driver.OracleResultSetImpl.getObject(OracleResultSetImpl.java:739) 
    at oracle.jdbc.driver.OracleResultSet.getObject(OracleResultSet.java:1470) 
    stacktrace truncated to protect my poor code... 

Je peux prendre une autre table, il Appelons: sanetable et exécuter cette même requête sur une colonne avec le même nom et tapez "ver_num nombre (19) non null par défaut 0". Et rs.getLong (colIndex) et rs.getObject (colIndex) fonctionnent très bien.

Aucune des deux colonnes n'est impliquée dans une contrainte ou un index. J'ai essayé pilote oracle 9.2.0.8, 9.2.0.5, 9.2.0.1, même 10. * (qui ne fonctionnera pas).

Est-ce que quelqu'un sait quelque chose sur ce que je peux faire ici?

Ceci est mon code de connexion de base. La seule différence entre les appels réussis est la table en question:

  Class.forName(oracle.jdbc.OracleDriver.class.getName()); 
    String url = "jdbc:oracle:thin:@IPADDRESS:PORT:INSTANCE"; 
     Connection conn = null; 
     ResultSet rs = null; 
     try { 
      conn = DriverManager.getConnection(url, "user","pass"); 
      PreparedStatement prepareStatement = conn.prepareStatement(
        "select distinct ver_num " + 

        "FROM [crazytable|sanetable] " 
        ); 
      rs = prepareStatement.executeQuery(); 
      assertNotNull(rs); 
      while (rs.next()) { 
       ResultSetMetaData md = rs.getMetaData(); 
       for (int i = 1; i <= md.getColumnCount(); i++) { 
        String key = md.getColumnLabel(i); 
        Object value = rs.getLong(key); 
        System.out.println(key+" : "+value 
          +" was null: "+rs.wasNull() 
          +" type: "+ rs.getType() 
          +" class: "+ md.getColumnClassName(i)); 
       } 
      } 
     } finally { 
      if (rs != null) { 
       rs.close(); 
      } 
      if (conn != null) { 
       conn.close(); 
      } 
     } 

edit: Le pilote se trouve sur cette page: http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/htdocs/jdbc9201.html

+0

Pourriez-vous s'il vous plaît mentionner le nom du fichier JAR des pilotes? –

Répondre

0

D'accord, je pense que je me suis dit cela. Je regardais à travers d'autres questions et j'ai remarqué qu'il y avait d'autres pilotes de type 4 Oracle. L'un d'entre eux est DataDirect (http://datadirect.com). J'ai utilisé une version d'essai de leur pilote et il était capable de retourner le rs.getObject (intIndex).

La valeur était: -1,6777120E-27. Donc, rs.getLong() arrondissait à zéro, mais le BigDecimal voyait une partie décimale et émettait une exception.

Peut-être est-ce dû au fait que le pilote d'Oracle est compilé avec jdbc1.4 vs, quelque chose de plus récent pour datadirect.

Questions connexes