0

次の問題の答えがわかりません。誰かが私を助けてくれることを願っています。ここで説明されているように、JAVA クラスを Struct にマッピングしています

私はOracleオブジェクトを持っています:

create or replace TYPE DK1 AS OBJECT( zahl CHAR(1) );

および対応する Java クラス:

public class DK1 implements SQLData {

  private String sql_type;
  public static final int _SQL_TYPECODE = OracleTypes.STRUCT;
  private String zahl;

  public DK1(String sql_type, String z) {
    this.sql_type = sql_type;
    setZahl(z);
  }

  public String getSQLTypeName() throws SQLException {
    return sql_type;
  }

  public void readSQL(SQLInput stream, String typeName) throws SQLException {
    sql_type = typeName;
    this.setZahl(stream.readString());
  }

  public void writeSQL(SQLOutput stream) throws SQLException {
    stream.writeString(getZahl());
  }

  public String getSql_type() {
    return sql_type;
  }

  public void setSql_type(String sql_type) {
    this.sql_type = sql_type;
  }

  public String getZahl() {
    return zahl;
  }

  public void setZahl(String zahl) {
    this.zahl = zahl;
  }
}

私のテスト方法は次のとおりです。

public class SQLDataExample {
  public static void main(String args[]) throws Exception {
    DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());

    OracleConnection conn = (OracleConnection) DriverManager.getConnection(
        "jdbc:oracle:thin:@................", "...",
        "...");

    Dictionary<String, Class<?>> map = (Dictionary) conn.getTypeMap();

    map.put("BONI.DK1", Class.forName("com.gwb.db.objects.DK1"));

    OracleCallableStatement cs = (OracleCallableStatement) conn.prepareCall("{call BOX.DK(?)}");

    DK1 dd = new DK1("BONI.DK1", "1");

    cs.setObject(1, dd);

    cs.registerOutParameter(1, OracleTypes.STRUCT, "BONI.DK1");

    cs.execute();

    DK1 df = (DK1) cs.getObject(1);
  }
}

さぁ、最後のステップ

DK1 df = (DK1) cs.getObject(1);

この手順は失敗し、ここ数日で非常に多くのことを試しましたが、実行できません! 私は得る

スレッド「メイン」で例外が発生しました

getObject を getSTRUCT に置き換えると、DB プロシージャが機能し、期待どおりに値が返されることがわかります。JAVA オブジェクトをマップできない理由がわかりません。

助けやヒントをいただければ幸いです。前もって感謝します

4

1 に答える 1