Java 无法将Weblogic结构类型转换为Oracle结构类型

Java 无法将Weblogic结构类型转换为Oracle结构类型,java,oracle,weblogic,Java,Oracle,Weblogic,我正在从java调用一个存储过程,作为out参数,我给出了一个struct。使用下面的代码,一切都很好 conn = DriverManager.getConnection(URL,"username","password") StructDescriptor recDescriptor = StructDescriptor.createDescriptor("TCS_CHALLAN",conn); CallableStatement stmt = conn.prepareCall("{ c

我正在从java调用一个存储过程,作为out参数,我给出了一个
struct
。使用下面的代码,一切都很好

conn = DriverManager.getConnection(URL,"username","password")
StructDescriptor recDescriptor =  StructDescriptor.createDescriptor("TCS_CHALLAN",conn);
CallableStatement stmt =  conn.prepareCall("{ call xx_get_challan_info(?, ?) }");
Object[] return_record_array = new Object[8];
STRUCT output_oracle_record;
stmt.setObject(1, challan_no);
stmt.registerOutParameter(2, OracleTypes.STRUCT, "TCS_CHALLAN");
output_oracle_record = ((OracleCallableStatement)stmt).getSTRUCT(2);
return_record_array = output_oracle_record.getAttributes();
当我从
weblogic服务器
上的
数据源
获取连接时,就会出现问题

javax.naming.Context initialContext = new javax.naming.InitialContext();
javax.sql.DataSource dataSource = (javax.sql.DataSource)initialContext.lookup("jdbc/testApps");
conn = dataSource.getConnection();
使用上面的
conn
对象,当我尝试相同的代码时,会出现错误

weblogic.jdbc.wrapper.Struct_oracle_sql_STRUCT cannot be cast to oracle.sql.STRUCT
2种可能的解决办法:

  • 使用java.sql.Struct而不是oracle.sql.Struct
  • 铸造连接:
  • javax.naming.Context initialContext=新的javax.naming.initialContext()
    javax.sql.DataSource DataSource=(javax.sql.DataSource)initialContext.lookup(“java:comp/env/jdbc/MyDS”)
    con=dataSource.getConnection()
    vendorConnection=(oracle.jdbc.OracleConnection)((weblogic.jdbc.extensions.WLConnection)con).getVendorConnection()


    这就是解决方案。在weblogic中运行代码时,您需要进行一些额外的转换。确保在类路径中包含jar文件

    /*Code to support Weblogic datatypes*/
      Object returnObj = stmt.getObject(2);
      if (returnObj instanceof Struct)
                    output_oracle_record = (oracle.sql.STRUCT)(((weblogic.jdbc.wrapper.Struct)returnObj).unwrap(Class.forName("oracle.sql.STRUCT")));
                else
                    output_oracle_record = (oracle.sql.STRUCT)returnObj;
    
                /*code for tomcat deployment*/
                //output_oracle_record = ((OracleCallableStatement)stmt).getSTRUCT(2);
    

    你有没有找到答案?在尝试使用WebLogic创建结构时,我遇到了类似的问题connection@semiColon是的,请看下面我的答案。谢谢你发布这个。如果我理解正确,您是在有效地剥离weblogic包装器的对象吗?我认为理想的解决方案是保留包装器并找到其他处理对象的方法,因为解除包装对象意味着weblogic无法再监控它的连接泄漏或度量。我有点匆忙,如果您不知道,请告诉我正确的解决方案:)我设法找到了另一种不使用结构完成任务的方法来解决这个问题。所以这对我来说仍然是个谜!