java和sql对象类型不一致

时间:2015-07-20 14:51:57

标签: java oracle jdbc

需要一些jdbc问题的帮助。

我真的很难找到解决方案。我没有很多使用JDBC的经验,并且看起来并不太新手。如果有人可以提供帮助,将不胜感激。帮助我的意思是指向我其他资源,如果你能提供直接的解决方案,甚至更好。

在oracle.sql.STRUCT.java:51

中创建了异常
throw new SQLException("Cannot construct STRUCT instance, invalid connection");

并抛出以下代码的最后一行:

SimpleJdbcCall simpleJdbcCall = getSimpleJDBCCall();
con = simpleJdbcCall.getJdbcTemplate().getDataSource().getConnection().getMetaData().getConnection();

WLConnection wc = (WLConnection) con;            
Connection vendorConn = wc.getVendorConnection();

con.setAutoCommit(false);

Object[] custIdentifier = { null, new Long(125435345L)};

StructDescriptor structDesc =         StructDescriptor.createDescriptor("O_CUSTOMER_TYPE_CID_PID", vendorConn);

STRUCT struct = new STRUCT(structDesc, vendorConn, custIdentifier);
STRUCT[] structArray = new STRUCT[] { struct };

ArrayDescriptor des = ArrayDescriptor.createDescriptor("T_CUSTOMER_TYPE_CID_PID", vendorConn);
ARRAY array = new ARRAY(des, vendorConn, structArray);

ArrayDescriptor desEvnt = ArrayDescriptor.createDescriptor("T_EVENT_TYPE_ID", vendorConn);
ARRAY arrayEvnt = new ARRAY(desEvnt, vendorConn, events);

StructDescriptor fltDetailsStructDesc =
                StructDescriptor.createDescriptor("O_FLIGHT_DETAILS", vendorConn);

DATE flightDateUTC = new DATE(flightDt);
NUMBER flightNum = new NUMBER(fltNo);
Object[] fltDetailFields = new Object[] { flightNum, flightDateUTC };

// Exception thrown in constructor below
STRUCT fltDetailsStruct = new STRUCT(fltDetailsStructDesc, vendorConn,     fltDetailFields);

我正在使用ojdbc6版本11.2.0.4

期望的SQl对象是:

TYPE O_FLIGHT_DETAILS AS OBJECT 
( 
FLIGHT_NO NUMBER(5), -- Marketing Flight Number 
UTC_DEP_DATE Date, -- Scheduled Flight departure Date in UTC 
BKG_DT DATE -- Flight Booking date in UTC 
);

任何帮助,非常感谢。

1 个答案:

答案 0 :(得分:2)

我认为问题如下:

'O_FLIGHT_DETAILS'对象的StructDescriptor期望一个包含3个值的数组,根据SQL对象。由于提供的数组仅包含2个值,因此发生了不匹配并抛出异常。错误消息'不一致的java和sql对象类型'是准确的。

我将fltDetailFields实例化行更改为:

Object[] fltDetailFields = new Object[] { flightNum, flightDateUTC, null };

它按预期工作。