Java c3p0和Oracle对象类型问题
使用jdbc和Oracle 10g开发了多个应用程序。现在我正在更改应用程序以供使用。但是我在使用Oracle类型时遇到了一些问题 我有这种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
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
运行良好
祝你好运