不能转换为OraclePreparedStatement:报错 -问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

不能转换为OraclePreparedStatement:报错

kun坤 2020-06-08 19:21:22 274

用C3P0连接池处理Oracle时说NewProxyPreparedStatement不能转换为OraclePreparedStatement:报错

本意是想用一种方法读取新插入Oracle的sequeuce的值,用C3P0作为连接池,方法如下

String sql = "insert into tb_(tb_id , tb_name) values(seq_.nextval,?) returning tb_id into ?";
//在这个地方出错
OraclePreparedStatement ppst = 
(OraclePreparedStatement)this.conn.prepareStatement(sql);

ppst.setString(1, "hehe");
ppst.registerReturnParameter(2, Type.INT);
ppst.executeUpdate();
ResultSet rs = ppst.getReturnResultSet();
rs.next();
id = rs.getInt(1);

异常是:
Caused by: java.lang.ClassCastException: com.mchange.v2.c3p0.impl.NewProxyPreparedStatement cannot be cast to oracle.jdbc.OraclePreparedStatement
说是C3P0的NewProxyPreparedStatemennt不能转换成OraclePreparedStatement,不知道有没有方法可以解决这个问题?google,百度了好久都没有答案,如果不能解决,那还是什么比较好的方法可以取得新插入Oracle的sequeuce的值?我看过有5种方法http://blog.csdn.net/yzsind/article/details/6918506,我用的是第5种,第4种我检验过可以用.
再顺便问一下,用returning into的方法可以取得delete或者是update的sequeuce的值吗?我测试好像是不行的.
谢谢啦~~

oracle转换 转换报错 preparedstatement报错 preparedstatement转换 不能转换报错
分享到
取消 提交回答
全部回答(1)
  • kun坤
    2020-06-08 19:21:28

    连接池拿出来的对象都是经过包装的,如果需要用原生对象,使用unwrap方法。
    PreparedStatement pstmt = conn.prepareStatement(sql); OraclePreparedStatement oracleStmt = pstmt.unwrap(OraclePreparedStatement.class); ######正解!!非常感谢!###### 这种奇怪问题我之前碰到过,不过是自己写的连接池。
    建议试试升级驱动和连接池看看,另外c3p0没怎么更新了,试试 druid 吧。 ######忘了说了驱动版本是ojdbc6.jar,在oracle官网上下的######

    引用来自“红薯”的答案

    这种奇怪问题我之前碰到过,不过是自己写的连接池。 建议试试升级驱动和连接池看看,另外c3p0没怎么更新了,试试 druid 吧。 @红薯 大哥~~还是不行啊,我下了最新的驱动和连接池也不行,用了druid还是一样在的问题 com.alibaba.druid.pool.DruidPooledPreparedStatement cannot be cast to oracle.jdbc.OraclePreparedStatement 你看看是不是我写的代码出的问题? oracle版本 oracleXE 11.2.0.2 Win32 java版本 JDK 1.7 update10
    0 0
数据库
使用钉钉扫一扫加入圈子
+ 订阅

分享数据库前沿,解构实战干货,推动数据库技术变革

相似问题
最新问题