0

私はこのチュートリアルを実行しようとしています: http://docs.oracle.com/javase/tutorial/jdbc/basics/sqlcustommapping.html そしてこれまでのところ、Oracle dbに「ADDRESS」タイプを作成し、そこにあるテーブルを作成しましたタイプ「ADDRESS」の列、チュートリアルのデータを含む単一のレコードをテーブルに入力しました。Javaでは、クラスアドレス(リンクからコピー)を作成しました。リンクの例とまったく同じように、マップ、呼び出し可能なステートメントがあります。私が自分のプログラムを実行しているとき、これは私が得る例外です: java.lang.ClassCastException: oracle.sql.STRUCT

私のコードの一部:

Map map = conn.getTypeMap();        
    try {
        map.put("my_schema.ADDRESS", Class.forName("mypackage.Address"));
        conn.setTypeMap(map);

        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT ADDRESS FROM my_schema.ADDRESS_TABLE");
            while (rs.next()) {

                Address location = (Address)rs.getObject("ADDRESS");

                System.out.println(location.city);
            }
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

スタックトレース全体:

java.lang.ClassCastException: oracle.sql.STRUCT
at mypackage.Example.test(Example.java:89)
at mypackage.Example.main(Example.java:52)

よろしくお願いします!

@新しいばか:

これは私のアドレスクラスです:

public class Address implements SQLData {
    public String num;
    public String street;
    public String city;
    public String state;
    public String zip;
    private String sql_type;

    public String getSQLTypeName() {
        return sql_type;
    }

    public void readSQL(SQLInput stream, String type)
        throws SQLException {
        sql_type = type;
        num = stream.readString();
        street = stream.readString();
        city = stream.readString();
        state = stream.readString();
        zip = stream.readString();
    }

    public void writeSQL(SQLOutput stream)
        throws SQLException {
        stream.writeString(num);
        stream.writeString(street);
        stream.writeString(city);
        stream.writeString(state);
        stream.writeString(zip);
    }
}

そして、これはオラクルでの私のタイプです:

CREATE OR REPLACE TYPE "ADDRESS" AS OBJECT 
(NUM       VARCHAR2(60),
 STREET    VARCHAR2(60),
 CITY      VARCHAR2(60),
 STATE     VARCHAR2(60),
 ZIP       VARCHAR2(60));

@Smit:以下は、mypackageが削除された場合に発生する例外です

map.put("my_schema.ADDRESS", Class.forName("mypackage.Address"));

    java.lang.ClassNotFoundException: Address
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:164)
at mypackage.Example.test(Example.java:77)
at mypackage.Example.main(Example.java:52)
4

1 に答える 1

1

謎の答えはこれ

  map.put("my_schema.ADDRESS", Class.forName("mypackage.Address"));

これに違いない

  map.put("MY_SCHEMA.ADDRESS", Class.forName("mypackage.Address"));

誰かが疑問に思った場合の詳細な説明:ここ

于 2013-07-05T07:59:38.013 に答える