数据库: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
相关推荐
C# 传入自定义列表List 到Oracle存储过程 亲测有效,执行速度极快
Spring jdbcTemplate调用Oracle存储过程返回List集合
Java调用Oracle存储过程的方法
SSH项目改为Spingboot项目,将项目中部分需要调用存储过程的部分用entityManagerFactory.unwrap(SessionFactory.class).openSession()来获取Session实现后发现项目访问数据库超过十次就会挂掉,原因是Springboot...
Oracle 存储过程资料集合! 值得下载看看!资源免费,大家分享!!
存储过程是一个可以用编程的方式来操作SQL的集合。
Java调用带参数的Oracle 存储过程并返回集合,
Oracle集合类型输出参数的PLSQL存储过程及其Java调用.docxOracle集合类型输出参数的PLSQL存储过程及其Java调用.docx
oracle存储过程常用技巧,包括:游标的处理,异常的处理,集合的选择等等
java调用Oracle存储过程的简单源码示例, 包括无返回参数,返回单个参数和返回参数集合三种调用情况!
Java调用oracle函数返回oracle类(类似)集合
oracle 创建表空间和用户; oracle job的创建及相关命令; oracle 触发器或存储过程中执行外部exe程序; oracle 导入导出; oracle 删除所有表的数据; sqlserver 读取excel
里面包含了删除,添加,返回list集合这三种应用
Oracle Exception汇总(自定义Oracle异常) 使用方法举例: Exception When no_data_found then Dbms_output.put_line(‘no_data_found’); ACCESS_INTO_NULL 为对象赋值前必需初始化对象。对应ORA-06530错误。 CASE...
C#中oracle连接数据库的封装类,有简短的说明
Oracle集合类型输出参数的PLSQL存储过程及其Java调用
无论是存储过程还是触发器,都是SQL 语句和流程控制语句的集合。 ORACLE代码 CREATE OR REPLACE PROCEDURE gd_CURSOR(MYCS1 OUT SYS_REFCURSOR,MYCS2 OUT SYS_REFCURSOR,a out varchar)as BEGIN a:='test'; OPEN ...
本文档详细介绍了如何在Oracle数据库中实现像C#等其它编程语言中Split函数来拆分字符的功能。例子简单易懂,并附有详细的实现过程。
完整版Oracle11数据库教程课件 第10章_存储过程_函数_触发器(共32页).ppt 完整版Oracle11数据库教程课件 第11章_权限的概述(共32页).ppt 完整版Oracle11数据库教程课件 第12章_备份与恢复(共66页).ppt
存储过程是存储在服务器上的 Transact-SQL 语句的命名集合,是封装重复性任务的方法。支持用户声明变量、条件执行以及其他强有力的编程特性