数据库:oracle 10g
jdk: 1.6.0_10
一定要记得导入orai18n.jar,否则一遇到字符串就乱码、添加不到数据。
1. 因为入参是一个java.util.List集合,所以需要一个Type 类型来存放这个List数据
CREATE OR REPLACE TYPE type_license_notice IS OBJECT( -- 许可证编号 license_code VARCHAR2(36), -- 零售客户名称 cust_name VARCHAR2(50), corporation_name VARCHAR2(100), manager VARCHAR2(50), manager_tel VARCHAR2(20) ); / CREATE OR REPLACE TYPE license_notice_list AS VARRAY(1000) OF type_license_notice; /
2. 存储过程
CREATE OR REPLACE PROCEDURE P_LICENSE_NOTICE(LICENSE_ARRAY IN LICENSE_NOTICE_LIST, RESCODE OUT NUMBER, RESSTR OUT VARCHAR2) IS BEGIN FOR I IN 1 .. LICENSE_ARRAY.COUNT LOOP BEGIN --NOTICE := LICENSE_ARRAY(I); INSERT INTO YC_BUSINESS_SEND (ID, BUSINESS_ID, MOBILE, RECIPIENT_NAME, TITLE, CONTENT, SEND_NUMBER, SEND_TIME, STATUS, CREATE_TIME) VALUES (SYS_GUID(), '1067e964-e7df-4eee-99e6-a533735c88d7', LICENSE_ARRAY(I).MANAGER_TEL, LICENSE_ARRAY(I).CORPORATION_NAME, '许可证领证通知', '零售客户,你好,你申请的许可证[' || LICENSE_ARRAY(I).LICENSE_CODE || ']已审批完成,请在2天后过来领取.', 0, NULL, 0, SYSDATE); COMMIT; EXCEPTION -- 如果有一条数据插入异常,则继续下一条 WHEN OTHERS THEN NULL; END; END LOOP; RESCODE := 1; RESSTR := '添加成功'; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('save license notice to YC_BUSINESS_SEND fail!' || SQLCODE || SQLERRM); RESCODE := 0; RESSTR := '添加失败' || SQLCODE || SQLERRM; ROLLBACK; END P_LICENSE_NOTICE;
3. 数据配置文件 application.properties (放在 classpath 下)
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver jdbc.url=jdbc:oracle:thin:@192.168.1.49:1523:DB02 jdbc.username=fsycsms2 jdbc.password=fsycsms2
4. 初始化数据库配置文件
public class InitServlet extends HttpServlet { /** * @Fields serialVersionUID : 序列化id */ private static final long serialVersionUID = -283273527502774557L; private static final Logger log = Logger.getLogger(InitServlet.class); @Override public void init() throws ServletException { log.info("Start to init InitServlet."); // 必须要调用父类的初始化方法 super.init(); // 解析并读取连接DB的配置属性文件 ParsePropertiesFile.getInstance().getConfig("application.properties"); log.info("End to init InitServlet."); } }
5. 在 web.xml 中配置 InitServlet
<!-- 初始化 --> <servlet> <servlet-name>initServlet</servlet-name> <servlet-class>cn.com.do1.component.init.InitServlet</servlet-class> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>initServlet</servlet-name> <url-pattern>/initServlet</url-pattern> </servlet-mapping>
6. java调用存储过程
import java.sql.CallableStatement; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Types; import java.util.ArrayList; import java.util.List; import oracle.jdbc.pool.OracleDataSource; import oracle.sql.ARRAY; import oracle.sql.ArrayDescriptor; import oracle.sql.STRUCT; import oracle.sql.StructDescriptor; import org.apache.log4j.Logger; import cn.com.do1.common.framebase.dqdp.BaseDAOImpl; import cn.com.do1.component.business.licencenotice.dao.ILicencenoticeDAO; import cn.com.do1.component.business.licencenotice.model.RmLicense; import cn.com.do1.component.business.po.YcBusinessMessagePO; import cn.com.do1.component.common.CommonConstants; import cn.com.do1.component.common.ConnectionPool; public List<Object> saveBusinessSend(List<RmLicense> list) throws Exception { Connection conn = getConnection(); CallableStatement stmt = conn .prepareCall("{call P_LICENSE_NOTICE(?,?,?)}"); ARRAY adArray = getOracleArray("LICENSE_NOTICE_LIST", list); // 入参 stmt.setArray(1, adArray); // 出参 stmt.registerOutParameter(2, Types.INTEGER); stmt.registerOutParameter(3, Types.VARCHAR); stmt.execute(); // 获取返回值.0:失败, 1:成功 int resCode = stmt.getInt(2); // 存储过程中返回的信息 String resStr = stmt.getString(3); List<Object> result = new ArrayList<Object>(); result.add(resCode); result.add(resStr); stmt.close(); return result; } /** * @Title: getOracleArray * @Description: 设置存储过程的集合入参 * @param typeName 集合入参名称 * @param objlist 集合数据 * @return ARRAY * @throws Exception * @author * @date 2012-11-26 */ public static ARRAY getOracleArray(String typeName, List<RmLicense> objlist) throws Exception { ARRAY list = null; String userName = CommonConstants.propMap.get("jdbc.username"); String password = CommonConstants.propMap.get("jdbc.password"); String url = CommonConstants.propMap.get("jdbc.url"); // 数据库url、名称 String dbUrl = null, dbName = null, prefix = null; if (null != url && !"".equals(url.trim())) { int index1 = url.indexOf("@"); int lastIndex = url.lastIndexOf(":"); prefix = url.substring(0, index1); dbUrl = url.substring(index1, lastIndex + 1); dbName = url.substring(lastIndex + 1, url.length()); } StringBuffer buf = new StringBuffer(); // jdbc:oracle:thin: buf.append(prefix); // fsycsms2/fsycsms2 buf.append(userName).append("/").append(password); // @192.168.1.49:1523: buf.append(dbUrl); // DB02 buf.append(dbName); OracleDataSource ods = new OracleDataSource(); ods.setURL(buf.toString()); // ods.setURL("jdbc:oracle:thin:fsycsms2/fsycsms2@192.168.1.49:1523:DB02"); Connection conn = ods.getConnection(); if (objlist != null && objlist.size() > 0) { StructDescriptor structdesc = new StructDescriptor( "TYPE_LICENSE_NOTICE", conn); STRUCT[] structs = new STRUCT[objlist.size()]; Object[] result = new Object[0]; RmLicense license = null; for (int i = 0; i < objlist.size(); i++) { license = objlist.get(i); result = new Object[5]; result[0] = license.getLicenseCode(); result[1] = license.getCustName(); result[2] = license.getCorporationName(); result[3] = license.getManager(); result[4] = license.getManagerTel(); structs[i] = new STRUCT(structdesc, conn, result); } ArrayDescriptor desc = ArrayDescriptor.createDescriptor(typeName, conn); list = new ARRAY(desc, conn, structs); } else { ArrayDescriptor desc = ArrayDescriptor.createDescriptor(typeName, conn); STRUCT[] structs = new STRUCT[0]; list = new ARRAY(desc, conn, structs); } return list; }
注:如果不是使用数据库连接池,请记得关闭 Connection
相关推荐
oracle存储过程中入参是逗号分隔,并且参数要使用在in过滤语句中查询数据。处理的方法与实现
本文将详细讲解如何在C#中使用自定义列表(List)作为参数调用Oracle存储过程,以及实现这一功能的关键技术和注意事项。 首先,我们需要了解Oracle数据库中的PL/SQL类型,例如VARCAR2、NUMBER等,它们对应于C#中的...
根据给定的信息,本文将详细解释如何在Java中通过调用存储过程实现带有自定义对象作为参数的大批量数据处理,并且特别关注了入参为二维数组的批量插入以及出参为自定义对象(二维数组)的情况。此外,还将讨论与...
总结起来,"帆软报表Oracle存储过程解决storeParameter1参数试用插件"主要是针对在调用无参数Oracle存储过程时出现的异常问题提供的一种解决方案。通过安装并配置这个插件,用户可以顺利地在帆软报表中调用不包含...
在Oracle存储过程中,`IN`参数用于传递数据到过程,`OUT`参数则允许过程向调用者返回数据。而`SYS_REFCURSOR`是Oracle提供的一种特殊类型,它允许存储过程动态地打开一个游标(即结果集)并将其作为`OUT`参数返回。 ...
总结来说,本示例展示了如何在Oracle存储过程中定义和使用结构化数组,以及如何在Java中调用这些存储过程并解析返回的多行多列数据。通过这种方式,你可以高效地处理复杂的数据结构,同时利用Java的灵活性来处理这些...
Oracle存储过程常用技巧 Oracle存储过程是一种强大的数据库对象,它可以帮助开发者简化复杂的业务逻辑,并提高数据库的安全性和性能。在 Oracle 中,存储过程是一种特殊的 PL/SQL 程序,它可以接受输入参数,执行...
Oracle存储过程是数据库管理系统中的一种重要特性,它允许开发者编写一系列SQL语句和PL/SQL块,形成可重复使用的代码单元。这篇博客“oracle存储过程-帮助文档”可能提供了关于如何创建、调用和管理Oracle存储过程...
### Oracle存储过程、函数与DBLink详解 #### 一、Oracle存储过程简介 在Oracle数据库中,存储过程是一种预编译好的SQL代码集合,它可以接受输入参数、返回单个值或多个值,并能够执行复杂的数据库操作。存储过程...
这个"ORACLE存储过程学习源码"集合包含了从基础到高级的30个示例,是学习和掌握Oracle存储过程的理想资源。下面,我们将深入探讨存储过程的基本概念、结构、类型,以及如何通过这些源码进行学习。 1. **存储过程的...
以下是一个简单的示例,展示了如何调用一个不带参数的Oracle存储过程: ```java Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); session....
### Oracle存储过程 存储过程是在数据库中预编译的一组SQL语句,用于执行复杂的业务逻辑或数据操作。它们可以接受输入参数,执行一系列数据库操作,并返回结果。在Oracle中,存储过程使用PL/SQL编写,可以在数据库...
在转换SSH项目到Spring Boot的过程中,遇到了由于连接池默认配置限制(默认连接数为10)导致的问题,即频繁调用存储过程后,数据库连接无法得到正确释放,从而引发项目崩溃。以下是对这三种调用方式的详细解释: 1....
本篇文章将深入探讨如何在Oracle存储过程中使用临时表,包括会话级临时表和事务级临时表。 ### 会话级临时表 会话级临时表(Session-Level Temporary Tables)只在创建它的会话内可见,并且在会话结束时自动删除。...
首先,`Oracle存储过程`是一种预编译的SQL和PL/SQL代码集合,可以被多次调用以执行特定的任务。它们提高了性能,降低了网络流量,并简化了数据库管理。在存储过程中调用外部脚本可以扩展Oracle的功能,比如自动化...
### Oracle存储过程学习经典 #### Oracle存储过程基础知识与实践 Oracle存储过程是SQL与PL/SQL结合的强大功能,用于封装复杂的数据操作逻辑于数据库内部,从而实现高效的事务处理和数据管理。以下是对Oracle存储...
Oracle存储过程是数据库管理系统Oracle中的一个重要特性,它允许开发者编写一系列的SQL和PL/SQL语句,形成一个可重复使用的程序单元。这个“Oracle存储过程案例”提供了丰富的学习材料,帮助用户从入门到精通掌握...
Oracle 存储过程编译 Oracle 存储过程编译是指在 Oracle 数据库中编译存储过程的过程。存储过程是一种预编译的 SQL 语句集合,用于实现特定的业务逻辑。编译存储过程是将其转换为机器代码,以提高执行速度和效率。 ...
在C#中调用Oracle存储过程来返回数据集是一个常见的任务,这涉及到ADO.NET库的使用,特别是OracleClient组件。Oracle存储过程是数据库中的预编译SQL代码块,可以接收输入参数,执行复杂的业务逻辑,并返回结果。在C#...