2011-09-16 17 views
0

には、jdbcとOracle 10gでいくつかのアプリケーションがありました。今私はc3p0の使用のためのアプリを変更しています。しかし、私はいくつかのOracleのタイプで動作する問題があります。c3p0とOracleオブジェクトタイプの問題

私は、このOracle型持っている:オブジェクトを表す Dataobj.class:その後、私は次のクラスとC3P0とJavaでアプリを持っている

CREATE OR REPLACE FUNCTION F_IS_DATA_OBJECT (datar in DATAOBJ) RETURN varchar2 IS 
    tmpVar varchar2(150); 
    BEGIN 
     tmpVar := 'Data object:'; 
     if datar.id is not null then 
      tmpVar := tmpVar || 'id=' || datar.ID; 
     end if; 

     if datar.name is not null then 
      tmpVar := tmpVar || 'name=' || datar.name; 
     end if; 


    return tmpVar;   

    EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
     NULL; 
    WHEN OTHERS THEN 
     RAISE; 
END F_IS_DATA_OBJECT; 

CREATE OR REPLACE 
TYPE DATAOBJ AS OBJECT 
(
    ID NUMBER, 
    NAME VARCHAR2(50) 
) 

そして、このOracle機能をタイプ:

package c3p0pruebas.modelo; 

import java.io.Serializable; 

import java.sql.SQLData; 
import java.sql.SQLException; 
import java.sql.SQLInput; 
import java.sql.SQLOutput; 

public class Dataobj implements SQLData, Serializable { 

    private String name; 
    private Integer id; 


    public Dataobj() { 
    } 

    public String getSQLTypeName() { 
     return "DATAOBJ"; 
    } 

    public void writeSQL(SQLOutput stream) throws SQLException { 
     stream.writeInt(id.intValue()); 
     stream.writeString(name); 
    } 

    public void readSQL(SQLInput stream, String typeName) throws SQLException { 
     id = new Integer(stream.readInt()); 
     name = stream.readString(); 
    } 


    public void setName(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 
    ... and its gets and sets .... 

メインクラスとメインメソッド:

Connection connection = DBConnectionManager.getInstance().getConnection("Mypool"); //I use a class to get connection 
    CallableStatement cs = null; 
    String error = ""; 
     try { 
/* 
//First I made a NativeExtractor of the connection, but the result is the same, I got it from Spring framework.    
//C3P0NativeJdbcExtractor extractor = new C3P0NativeJdbcExtractor(); 
      //OracleConnection newConnection = (OracleConnection) extractor.getNativeConnection(connection); 

      //cs = (OracleCallableStatement) newConnection.prepareCall("{? = call F_IS_DATA_OBJECT(?)}"); 
*/ 
      //Creates the object 
      Dataobj obj = new Dataobj(); 
      obj.setId(new Integer(33)); 
      obj.setName("myName"); 

      cs = connection.prepareCall("{? = call F_IS_DATA_OBJECT(?)}"); 

      cs.registerOutParameter(1, OracleTypes.VARCHAR); 
      cs.setObject(2, obj); 

      cs.execute(); 
      error = cs.getString(1); 

      System.out.println("Result: " + error); 

     } catch (SQLException e) { 
      e.printStackTrace(); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } finally { 
      closeDBObjects(null,cs,null); 
     } 
    closeDBObjects(null, null, connection); //Close connection 

実行が取得されます。

Data object: id=33. 

私は文字列(VARCHAR2)値、名前の文字列を取得傾けます。

オブジェクト型のオラクル配列で、私は同じ問題を抱えていて、JDBCでうまく動作しました。私は配列で働いていたときに、また、それは文字列値をhasn't:このステップで

//Here I use a NativeConnection ... 
    Dataobj arrayOfData[] = new Dataobj[myDataObj.size()]; 
... //Makes the array of DataObj. 
       ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor("OBJ_ARRAY", newConnection); 
      ARRAY arrayDatas = new ARRAY(descriptor, newConnection, arrayOfData); 

//、arrayDatasのオブジェクトが...

感謝を名前の文字列をhaven't !!!

答えて

0

OK、それは最終的に動作します。

検索、我々は答えを見つけた:

私たちは、データベース内のデータの定義を変更し、今では動作します:

CREATE OR REPLACE 
TYPE "DATAOBJ" AS OBJECT 
(
    vid NUMBER, 
    vname NCHAR(50) 
) 

感謝を!

0

私は同じ問題を抱えていたし、私は変更VARCHAR2 to NCHARせずに解決し、私にとっては、NCHARはOracleで文字列表示されませんので、滞在「?」すべてのポジションで

私は私の場合には11.2.0.1.0だった、私のデータベースのバージョンにWARのOracleドライバを変更: http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html

と私は別のドライバを入れて、それは、OracleのオブジェクトとコレクションのためのNLSであります: http://download.oracle.com/otn/utilities_drivers/jdbc/112/orai18n.jar

これで、私は問題を解決し、VARCHAR2は正常に機能しました。

幸運。