无法将 Weblogic 结构类型转换为 Oracle 结构类型
Unable to Weblogic Struct Type to Oracle Struct Type
我正在从 java 调用一个存储过程,作为输出参数,我给出一个 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 server
的 datasource
获得连接时出现问题。
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 = new 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();
所以这是 solution.When 运行 你在 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);
我正在从 java 调用一个存储过程,作为输出参数,我给出一个 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 server
的 datasource
获得连接时出现问题。
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 = new 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();
所以这是 solution.When 运行 你在 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);