Java调用Oracle存储过程传入数组参数报错

weblogic连接池 JNDI提供的链接保存 Oracle数组 报错 oracle.jdbc.driver.T4CConnection cannot be cast to oracle.jdbc.OracleConnection

oracle.jdbc.driver.T4CConnection cannot be cast to oracle.jdbc.OracleConnection

大家好,我在用weblogic连接池 JNDI 提供的,连接保存,oracle自定数组 报错,麻烦问问,怎么搞咯?谢谢哈

ArrayList array;
ARRAY adArray = getExpInfoArray(con,"EXP_INFO_TYPE_ARR", array);

参数解释:

(1)
EXP_INFO_TYPE_ARR 是Oracle数据库中定义的数组类型的名称

(2)
array是java类型的对象集合对象,就可以在调用存储过程时作为数组参数传入。

需注意的是,connection必须是Native Connection,如果connection是通过JDBC建立数据库连接并获取的,就不会有问题,

但是如果是通过JNDI数据源获取的,就不行,因为从数据源获取的Connection是Native Connection的代理类,

比如Tomcat中通过配置的JNDI数据源获取连接,连接类型是org.apache.commons.dbcp.PoolableConnection类型的;

在WebLogic、JBoss等其他服务器中,得到的Connection类型又是不同的

报错信息如下:
oracle.jdbc.driver.T4CConnection cannot be cast to oracle.jdbc.OracleConnection

上网搜索的到2个解决办法如下:

(1)删除WEB-INF/lib目录下的Oracle数据库驱动

http://raise.diandian.com/java/the-method-for-passing-arrays-para-to-oracle.html

方法(1)给出的解决方式:部署环境下,删除WEB-INF/lib目录下的Oracle数据库驱动!---
按照这样删除的话,上面的代码岂不是编译报错?

(2)从数据源获取物理连接

http://middleware123.com/weblogic/docs100/jdbc/thirdparty.html

Connection conn = null; try { ctx = new InitialContext(ht);

// 在 JNDI 树上查找数据源并请求 // 连接。

javax.sql.DataSource ds = (javax.sql.DataSource) ctx.lookup ("myDataSource");

// 总是在 try 块中获取缓冲池连接, // 在这里,完全使用缓冲池连接,

// 并且必要时,在 finally 块中关闭缓冲池连接。 conn = ds.getConnection();

// 现在可以将 conn 对象转换为 WLConnection // 接口,然后获取底层物理连接。

java.sql.Connection vendorConn = ((WLConnection)conn).getVendorConnection();

// 不关闭 vendorConn // 也可以将 vendorConn 对象转换为供应商

// 接口,例如: // oracle.jdbc.OracleConnection vendorConn = (OracleConnection)

// ((WLConnection)conn).getVendorConnection()

试过了以上方法,还是不行,还是报错:
oracle.jdbc.driver.T4CConnection cannot be cast to oracle.jdbc.OracleConnection

---真诚感谢,有心回复教导的人,虽然我没钱钱,,工资也很底...

我也遇到了这个问题,最终解决方案
1、删除web-info/lib下的ojdbc包
2、web-info下面weblogic.xml里面,添加 true
3、 spring配置文件,添加nativeJdbcExtractor注入
class="org.springframework.jdbc.support.nativejdbc.WebLogicNativeJdbcExtractor"
lazy-init="true" />

<!-- <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiName" value="java:comp/env/jdbc/OracleDataSource" /> 
    </bean> -->
<jee:jndi-lookup id="dataSource" jndi-name="DataSource_decode"
    resource-ref="true" />

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource" />
    <property name="nativeJdbcExtractor" ref="nativeJdbcExtractor" />
</bean>

思路:获取weblogic本地的原始conn来替换jdbc的conn
另外因为web-info下面的包先加载,ojdbc4与weblogic下面的jdbc冲突,故删除web-info/lib下面的jdbc包
编译的时候把ojdbc14.jar添加到classpath即可,不影响编译,(只要不放到web-info/lib下面的包,都不会部署到Weblogic里面)