c3p0和Oracle对象类型问题

发布于 2024-12-05 02:06:44 字数 3644 浏览 1 评论 0原文

有几个使用 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;

然后我有一个 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.

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

谢谢!!!

had several apps with jdbc and Oracle 10g. Now I´m changing the apps for use c3p0. But I have some problems working with Oracle types.

I Have this Oracle type:

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

And this Oracle function:

    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;

then I have a app in Java with c3p0 with next classes:
Dataobj.class to represent the object type:

    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 ....

And the main class and main method:

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

The execution gets:

Data object: id=33.

I cant get the String (Varchar2) value, the name string.

With oracle arrays of object type, I have the same problem, It worked nice with JDBC. When I worked with Arrays, also, it hasn´t the string values:

//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);

//In this step, objects of arrayDatas haven´t the name string...

Thanks!!!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

-黛色若梦 2024-12-12 02:06:44

好的,终于成功了。

搜索后,我们找到了答案:

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

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

谢谢!

OK, It finally works.

Searching, We found out the answer:

We change data definition in the database and now it works:

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

Thanks!

£冰雨忧蓝° 2024-12-12 02:06:44

我遇到了同样的问题,我没有将 VARCHAR2 更改为 NCHAR 就解决了,因为对我来说,NCHAR 没有出现在 Oracle 中的 String , 停留 ”?”在所有职位上。

我将 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 工作正常。

祝你好运。

I had the same problem and i solved without change VARCHAR2 to NCHAR, because for me, the NCHAR doesn't appear the String in the Oracle, stay "?" in all the positions.

I changed the oracle driver of the WAR to the version of my database, in my case was 11.2.0.1.0:
http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html

And i put another driver, that is the NLS for Oracle Objects and Collections:
http://download.oracle.com/otn/utilities_drivers/jdbc/112/orai18n.jar

With this, i solved the problem and the VARCHAR2 worked fine.

Good luck.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文