Java c3p0和Oracle对象类型问题

Java c3p0和Oracle对象类型问题,java,arrays,oracle,c3p0,Java,Arrays,Oracle,C3p0,使用jdbc和Oracle 10g开发了多个应用程序。现在我正在更改应用程序以供使用。但是我在使用Oracle类型时遇到了一些问题 我有这种Oracle类型: CREATE OR REPLACE TYPE DATAOBJ AS OBJECT ( ID NUMBER, NAME VARCHAR2(50) ) 这个Oracle功能: CREATE OR REPLACE FUNCTION F_IS_DATA_OBJECT (datar in DATAOBJ) RETURN varc

使用jdbc和Oracle 10g开发了多个应用程序。现在我正在更改应用程序以供使用。但是我在使用Oracle类型时遇到了一些问题

我有这种Oracle类型:

CREATE OR REPLACE
TYPE DATAOBJ AS OBJECT
(
  ID NUMBER,
  NAME VARCHAR2(50)
) 
这个Oracle功能:

    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;
然后我有一个Java应用程序,带有c3p0和下一个类: 用于表示对象类型的Dataobj.class:

    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)值,名称字符串

对于对象类型的oracle阵列,我也有同样的问题,它与JDBC配合得很好。当我使用数组时,它也没有字符串值:

//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的对象没有名称字符串

谢谢

好的,它终于起作用了

通过搜索,我们找到了答案:

我们更改了数据库中的数据定义,现在它可以工作了:

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

谢谢

我也遇到了同样的问题,我没有做任何更改就解决了
VARCHAR2到NCHAR
,因为对我来说,
NCHAR
在Oracle中没有出现字符串,在所有位置都保留“?”

我将WAR的oracle驱动程序更改为我的数据库版本,在我的示例中是11.2.0.1.0:

我放置了另一个驱动程序,即Oracle对象和集合的NLS:

这样,我就解决了问题,
VARCHAR2
运行良好

祝你好运