c3p0 и проблема типа объекта Oracle - PullRequest
0 голосов
/ 16 сентября 2011

имел несколько приложений с 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 ....

И основной класс и метод main:

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), строку имени.

С массивами оракулов типа объекта у меня та же проблема, с 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 не имеют строки имени ...

Спасибо!!!

Ответы [ 2 ]

0 голосов
/ 28 марта 2013

У меня была та же проблема, и я решил без изменений VARCHAR2 to NCHAR, потому что для меня NCHAR не появляется Строка в Oracle, оставайтесь "?"во всех позициях.

Я изменил драйвер оракула WAR на версию моей базы данных, в моем случае было 11.2.0.1.0: http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html

И я поставил другой драйверэто NLS для объектов и коллекций Oracle: http://download.oracle.com/otn/utilities_drivers/jdbc/112/orai18n.jar

С этим я решил проблему, и VARCHAR2 работал нормально.

Удачи.

0 голосов
/ 11 октября 2011

ОК, наконец-то работает.

Поиск, Мы нашли ответ:

Меняем определение данных в базе данных и теперь оно работает:

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

Спасибо!

...