Java 使用LogicalConnection传递数组/表Oracle类型

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

我有一个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 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引用,同样的错误也会发生