【问题标题】:c3p0 and Oracle object type problemc3p0和Oracle对象类型问题
【发布时间】:2011-11-18 12:08:08
【问题描述】:

有几个使用 jdbc 和 Oracle 10g 的应用程序。现在我正在更改使用 c3p0 的应用程序。但是我在使用 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;

然后我有一个带有 c3p0 的 Java 应用程序和下一个类: 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.

我无法获取 String (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的对象没有名字字符串...

谢谢!!!

【问题讨论】:

    标签: java arrays oracle c3p0


    【解决方案1】:

    我有同样的问题,我没有改变VARCHAR2 to NCHAR就解决了,因为对我来说,NCHAR在Oracle中没有出现字符串,留下“?”在所有位置。

    我将 WAR 的 oracle 驱动程序更改为我的数据库版本,在我的情况下是 11.2.0.1.0: 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 工作正常。

    祝你好运。

    【讨论】:

      【解决方案2】:

      好的,终于成功了。

      搜索,我们找到了答案:

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

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

      谢谢!

      【讨论】:

        猜你喜欢
        • 2012-07-16
        • 2018-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多