2 luobobaobao2012 luobobaobao2012 于 2013.07.03 14:45 提问

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个回答

qihezhuanjia123
qihezhuanjia123   2015.10.05 20:10

我也遇到了这个问题,最终解决方案
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里面)
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
nls_charset12.jar oracle 10
用java调用oracle存储过程,传入数组参数,数组项为空值。
java调用oracle中输入参数是数组类型的函数或者存储过程
这次遇到一个开发需求,提供一个接口,输入参数是数组类型,要通过oracle封装的函数进行调用,返回结果也是一个数组。 记录一下对这种类型的实现方法,备忘。实际名称中用xxx替换了部分值,参考用 oracle端: FUNCTION    xxx_func(i_a_array   IN cux_b2b_xxx_type, --数组类型参数                            
java往oracle存储过程中传递数组方法小结
1、将数组转换成逗号分隔字符串,在存储过程中解析 2、自己创建个类型,用于接收数组 java往oracle存储过程中传递数组方法小结,下面是一个例子,比如存储过程中要  接受一个数组,并且输出一个数组,则先注意数组在oracle中的定义方法如下:  CREATE TYPE array_table AS TABLE OF VARCHAR2 (50); -- Array of St
Oracle编写带数组参数的存储过程
--功能:采用存储过程、type组合来实现批量操作,以节省系统开销,提高效率。 --创建 Type bodies CREATE OR REPLACE TYPE TYPE_ARRAY AS OBJECT ( ID NUMBER(10), REMARK VARCHAR2(10) ) --创建 Types CREATE OR
oracle 向存储过程传入数组类型参数
最近想试试给存储过程传数组参数,破费周折,在这里与大家分享下: 我用的plsql, 打开plsql,在type目录下面,可以创建自定义的数据类型, 于是用  create or replace type tab_str as table  of varchar2(30);  创建了一个数组类型。 接着用存储过程 procedure testfortable(pra in tab
Oracle中把Array类型作为参数传入存储过程示例
Oracle中把Array类型作为参数传入存储过程并用Java对其进行调用的示例是本文我们主要要介绍的内容,接下来我们就开始介绍这一过程……   Oracle中把Array类型作为参数传入存储过程并用Java对其进行调用的示例是本文我们主要要介绍的内容,接下来我们就开始介绍这一过程。   使用Oracle Database 11g Enterprise Editio
mybatis传入array
1.mapper.java中List&amp;lt;MacTicket&amp;gt; selectByPrimaryKeyList(String[] stringArray);mapper.xml中 &amp;lt;select id=&quot;selectByPrimaryKeyList&quot; parameterType=&quot;int&quot; resultMap=&quot;BaseResultMap&quot;&amp;gt;&amp;lt;foreach collect...
Mybatis传list参数调用oracle存储过程
怎么利用MyBatis传List类型参数到数据库存储过程中实现批量插入数据? MyBatis中参数是List类型时怎么处理?大家都知道MyBatis批处理大量数据是很难做到事务回滚的(事务由Spring管理),都将逻辑写在存储中又是及其头疼的一件事(参数长度也有限制),那么我想的是将参数在后台封装为单个或多个list集合,直接通过MyBatis将此参数传到数据库存储过程中,一来摆脱了My
oracle存储过程接收自定义数组类型参数
在使用oracle进行批量插入的时,如果数据量较小可以使用install all的语法进行批量插入。如果数据量较大,再使用insert all的语句插入就会发生错误,因为这个语法会受到限制,oracle不允许一次性插入的列数乘以行数>1000,这时就可以考虑使用存储过程批量插入了。 使用存储过程批量插入很显然要接收一个数组当参数,而且这个数组里的元素类型应该和java里自定义的数据模型对应。
java调用oracle存储过程传入参数为数组的处理
<br />java调用参数为数组的存储过程,主要是能正确的把java的数组类型转化为oracle能识别的的数组类型,这一步网上的例子很多,也就不多说了。在最初做这个的时候发现,当传入数字数组的时候,数组里的值能正确的插入到数据库中,但是其他类型的数组却无法插入,程序也不报错,后来查了很久,乱搞一通,发现了问题所在,先写在这里,也算是个经验……<br /> <br />oracle程序:<br /> <br />先创建一个数组类型和一个测试表<br />create or replace  varchar_