Java调用Oracle存储过程传入数组参数的方法
Java调用Oracle存储过程传入数组参数的方法 周四的时候,修改我们系统的代码,应另外一个公司的要求,要修改我们系统调用他们公司的提供的存储过程的调用方式。修改前,是通过配置的数据库用户名和密码直接访问到他们的数据库,再调用存储过程;现在要修改成
Java调用Oracle存储过程传入数组参数的方法
周四的时候,修改我们系统的代码,应另外一个公司的要求,要修改我们系统调用他们公司的提供的存储过程的调用方式。修改前,是通过配置的数据库用户名和密码直接访问到他们的数据库,再调用存储过程;现在要修改成从我们的数据库中直接访问他们授权的存储过程。以前之所以通过用户名密码访问他们的数据库后再调用,是因为储过程的一个输入参数是数组类型的,传递数组参数的时候,Connection的类型一定要是OracleConnection的,当时只知道使用用户名密码直接通过JDBC访问Oracle,获取连接,再传递参数进去是没有问题的,其他的方式试了下不行,时间紧,也就没去折腾。正好这次又要改,而且不允许直接JDBC访问拿Connection了,系统部署在WebLogic上,必须从WebLogic的连接池中获取连接。
Java向Oracle传递数组参数的方法:
ArrayDescriptor arraydesc = ArrayDescriptor.createDescriptor(sql_type_name, connection); //sql_type_name 是Oracle数据库中定义的数组类型的名称 ARRAY array = new ARRAY(arraydesc, connection, elements); //elements是Java数组类型的对象
这里的array对象,就可以在调用存储过程时作为数组参数传入。需注意的是,connection必须是Native Connection,如果connection是通过JDBC建立数据库连接并获取的,就不会有问题,但是如果是通过JNDI数据源获取的,就不行,因为从数据源获取的Connection是Native Connection的代理类,比如Tomcat中通过配置的JNDI数据源获取连接,连接类型是org.apache.commons.dbcp.PoolableConnection类型的;在WebLogic、JBoss等其他服务器中,得到的Connection类型又是不同的。
通过JNDI数据源获取连接的情况下,需要对获取到的连接进行一定的处理,获取到Native Connection。
如果项目中使用了Spring,那么,在使用JNDI数据源获取数据库连接的情况下,可以方便地通过Spring的NativeJdbcExtractor获取Native Connection。Spring中所包含的NativeJdbcExtractor实现有:C3P0NativeJdbcExtractor、CommonsDbcpNativeJdbcExtractor、JBossNativeJdbcExtractor、NativeJdbcExtractor、SimpleNativeJdbcExtractor、WebLogicNativeJdbcExtractor、WebSphereNativeJdbcExtractor、XAPoolNativeJdbcExtractor,根据应用部署环境的不同选择相应的NativeJdbcExtractor实现。
如果项目中没有使用Spring呢,大家可以去下载Spring的源码,找找这几个NativeJdbcExtractor的代码,参考一下就OK啦。 开源就是好嘛!
在成功获得Native Connection后,运行代码,却没有出现预期的成功调用的结果,而是抛出如下异常:
java.lang.ClassCastException: oracle.jdbc.driver.T4CConnection cannot be cast to oracle.jdbc.OracleConnection
at oracle.sql.ArrayDescriptor.createDescriptor(ArrayDescriptor.java:149)
at oracle.sql.ArrayDescriptor.createDescriptor(ArrayDescriptor.java:115)
搞到这里,我就糊涂了,我拿到了Native Connection了啊,你还要我怎样啊……心里那个郁闷啊……
郁闷归郁闷,还得抓点紧解决问题不是,结果又是一顿狂搜,还行,最终找到了解决方案:
部署环境下,删除WEB-INF/lib目录下的Oracle数据库驱动!
删除完毕,程序跑起来,果然这个异常没了……真TMD的不容易啊……感觉技术方面还是比较菜,需要多学习……

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

Java 8引入了Stream API,提供了一种强大且表达力丰富的处理数据集合的方式。然而,使用Stream时,一个常见问题是:如何从forEach操作中中断或返回? 传统循环允许提前中断或返回,但Stream的forEach方法并不直接支持这种方式。本文将解释原因,并探讨在Stream处理系统中实现提前终止的替代方法。 延伸阅读: Java Stream API改进 理解Stream forEach forEach方法是一个终端操作,它对Stream中的每个元素执行一个操作。它的设计意图是处

JavaMadeSimple:ABeginner'sGuidetoProgrammingPower简介Java是一种强大的编程语言,广泛应用于从移动应用程序到企业级系统的各种领域。对于初学者来说,Java的语法简洁易懂,是学习编程的理想选择。基本语法Java使用基于类的面向对象编程范式。类是将相关数据和行为组织在一起的模板。以下是一个简单的Java类示例:publicclassPerson{privateStringname;privateintage;

Java是热门编程语言,适合初学者和经验丰富的开发者学习。本教程从基础概念出发,逐步深入讲解高级主题。安装Java开发工具包后,可通过创建简单的“Hello,World!”程序实践编程。理解代码后,使用命令提示符编译并运行程序,控制台上将输出“Hello,World!”。学习Java开启了编程之旅,随着掌握程度加深,可创建更复杂的应用程序。
