2009-04-10 2 views
0

저는 Oracle 9i에서 프로젝트 작업을하고 있습니다. 테이블에서 특정 행을로드하는 10.1.3 상위 링크에 문제가 있습니다. 그것은 toplink가 의존하는 jdbc 드라이버가 매우 재미 있습니다. 아마도 여기 누군가가 도와 줄 수 있습니다.오라클에서 동일하게 보이지 않는 두 개의 열은 언제입니까?

나는 crazytable이라는 테이블을 가지고 있습니다. 열이 있습니다 : "ver_num number (19) not null default 0". 이 열은 몇 년 전에 원본 삽입물의 일부로 테이블에 추가되었습니다. crazytable에서 레코드를 선택 (jdbc 연결 코드는 아래 참조)하고 rs.getLong (colIndex)을 시도하면 모든 것이 정상적으로 작동합니다. 나는 rs.getObject (colIndex)을 할 경우, 나는 스택 트레이스 얻을 : sanetable하고, 같은 이름의 컬럼에 대해이 같은 쿼리를 실행하고 : 나는 다른 테이블을 취할 수

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... 

를 호출 할 수 있습니다 "ver_num number (19) not null default 0"을 입력하십시오. 그리고 rs.getLong (colIndex)과 rs.getObject (colIndex)는 정상적으로 작동합니다.

어느 열도 제약 조건 또는 인덱스와 관련이 없습니다. 나는 oracle 드라이버 9.2.0.8, 9.2.0.5, 9.2.0.1, 심지어 10을 시도했다. * (작동하지 않을 것이다).

내가 할 수있는 것에 대해 아는 사람이 있습니까?

이것은 내 기본적인 연결 코드입니다.

  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(); 
      } 
     } 

편집 : 성공적인 통화 사이의 유일한 차이는 문제의 특정 테이블입니다 드라이버는이 페이지에서 찾을 수 있습니다 : http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/htdocs/jdbc9201.html

+0

드라이버 jar 파일 이름을 말씀해 주시겠습니까? –

답변

0

좋아 나는이 알아 낸 것 같아요. 다른 질문을보고 있었고 다른 오라클 유형 4 드라이버가 있음을 알았습니다. 그 중 하나가 DataDirect (http://datadirect.com)입니다. 그들의 드라이버의 평가판을 사용했고 rs.getObject (intIndex)를 반환 할 수있었습니다.

값은 -1.6777120E-27입니다.

그래서 rs.getLong()은 0으로 반올림되었지만 BigDecimal은 소수 부분을보고 예외를 던지고있었습니다.

아마도 이것은 오라클의 드라이버가 jdbc1.4와 비교하여 컴파일 되었기 때문일 수 있습니다. 이는 datadirect에 새로운 것입니다.