Oracleで同じように見える2つの列が同じように見えるのはいつですか?

StackOverflow https://stackoverflow.com/questions/736531

  •  09-09-2019
  •  | 
  •  

質問

私はOracle 9iのプロジェクトに取り組んでいます。 TopLink 10.1.3に特定の行をテーブルにロードすることに問題がありました。 Toplinkが頼っているJDBCドライバーは非常に面白い行動をしていることがわかります。おそらくここの誰かが助けることができます...

crazyTableという名前のテーブルがあります。列があります:「ver_num番号(19)null default0」。この列は、数年前に元の挿入の一部としてテーブルに追加されました。 CrazyTableからレコード(JDBC接続コードについては以下を参照)を選択し、Rs.getLong(Colindex)を実行しようとすると、すべてが正常に機能します。ただし、rs.getObject(colindex)を行うと、スタックトレースが表示されます。

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

別のテーブルを取ることができます。それを呼び出します:sanetable、同じ名前の列に対してこの同じクエリを実行し、「ver_num number(19)not noll default 0」と入力します。 rs.getlong(colindex)とrs.getobject(colindex)は正常に動作します。

どちらの列も制約またはインデックスに関与していません。 Oracle Driver 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

役に立ちましたか?

解決

さて、私はこれを理解したと思います。私は他のいくつかの質問を見ていましたが、他のOracle Type 4ドライバーがあることに気付きました。その1つはdatadirectです(http://datadirect.com)。私は彼らのドライバーのトライアルバージョンを使用し、Rs.GetObject(Intindex)を返すことができました。

値は-1.6777120E -27でした。

そのため、rs.getlong()はゼロに丸めていましたが、BigDecimalは小数の部分を見て例外を投げかけていました。

おそらくこれは、OracleのドライバーがJDBC1.4 VSでコンパイルされているためです。これは、DataDirectにとってより新しいものです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top