Java 使用LogicalConnection传递数组/表Oracle类型
我有一个Oracle过程,它接受用户定义类型的输入。UDT是一个对象数组(另一个UDT)。下面是类型声明。IBM Integration Bus JDBC可配置服务用于获取逻辑连接,它始终提供逻辑连接Java 使用LogicalConnection传递数组/表Oracle类型,java,sql,oracle,jdbc,messagebroker,Java,Sql,Oracle,Jdbc,Messagebroker,我有一个Oracle过程,它接受用户定义类型的输入。UDT是一个对象数组(另一个UDT)。下面是类型声明。IBM Integration Bus JDBC可配置服务用于获取逻辑连接,它始终提供逻辑连接 create or replace Type R_OpenCloseRecords as Object(VSerial_No number, VError_Code varchar2(2), VReason varchar2(255), VStatus char(1)); create or
create or replace Type R_OpenCloseRecords as Object(VSerial_No number, VError_Code varchar2(2), VReason varchar2(255), VStatus char(1));
create or replace Type T_OpenCloseType as varray(100) of R_OpenCloseRecords ;
procedure UpdateOpenCloseRecord(VOpenCloseType in T_OpenCloseType);
我也尝试了上面的记录表
我使用java oracle类型ArrayDescriptor和StructDescriptor尝试了上述场景。但它返回时有一个异常:oracle.jdbc.driver.LogicalConnection与oracle.jdbc.OracleConnection不兼容
如果我使用java.sql.Struct,它可以很好地用于对象类型,但是createArrayOf方法失败,异常是:不支持的特性
下面是我的java代码片段:
callableStatement = connection.prepareCall("{call " + schemaPackageName + ".UpdateOpenCloseRecord(?)}");
//callableStatement.registerOutParameter(1, Types.OTHER);
callableStatement.setQueryTimeout(timeOut);
// StructDescriptor R_OpenCloseRecords = StructDescriptor.createDescriptor("R_OpenCloseRecords", connection);
// Object[] arrayObjectRecord = { data.getSerialNo(), data.getErrorCode(), data.getReason(), data.getStatus() };
// STRUCT RecordStruct = new STRUCT(R_OpenCloseRecords, connection, arrayObjectRecord );
Object[] arrayObjectRecord = { Integer.parseInt(data.getSerialNo()), data.getErrorCode(), data.getReason(), data.getStatus() };
Struct recordStruct = connection.createStruct((schemaName+ ".R_OpenCloseRecords").toUpperCase(), arrayObjectRecord);
// STRUCT[] arrayObjectTable = {RecordStruct};
// ArrayDescriptor T_OpenCloseType = ArrayDescriptor.createDescriptor(
// schemaPackageName+ ".T_OpenCloseType", connection);
// VOpenCloseArray = new ARRAY(T_OpenCloseType, connection, arrayObjectTable);
Object[] arrayObjectTable = {recordStruct};
callableStatement.setObject(1,connection.createArrayOf((schemaName+ ".T_OpenCloseType").toUpperCase(), arrayObjectTable) );
//callableStatement.setObject(1, arrayObjectTable, Types.ARRAY);
//callableStatement.setArray(1,VOpenCloseArray);
callableStatement.execute();
您可以在注释中看到描述符的使用。使用MbJavaComputeNode的getJDBCType4Connection获取连接
等待您的回复。问题通过外部引用ojdbc jar解决,该jar实际上不包括bar文件中的jar。这可能是由于与
类路径中的两个不同版本的ojdbc
jar冲突造成的。可能是一个随应用服务器一起提供,另一个随项目一起提供!当我使用oracle类型时,应用程序内和应用程序服务器(IBM Integration Bus JDBC可配置服务)上引用的ojdbc是相同的。如果没有描述符,我不需要jar引用,同样的错误也会发生