Java调用存储过程(返回:简单类型、自定义对象、列表数组)
2012-03-20 17:50
621 查看
由于公司使用的Jdevelope进行开发,有一套已经封装好的框架,因此调用存储过程非常简单,小弟今天突然想着能不能使用jdbc自主调用下下存储过程,包括各种返回类型,在参考网上的现有代码研究了两个下午之后,写了三个东西,也算是总结吧。
一、返回参数为简单类型,见代码:
注意:如果输出的参数结果中有中文,有时候会有乱码的现象,可以下载语言包(http://download.csdn.net/detail/kxcc_sx/393164#comment)并添加到环境中就可以了,我的是这样的,对于jdk版本比较低的可能还需要对应的oracle驱动包。
一、返回参数为简单类型,见代码:
package com.konkon.pk.call; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Types; public class CallPkSimpleType { public CallPkSimpleType() { super(); } public static void main(String[] args) { Connection conn = null; CallableStatement proc = null; try { Class.forName("oracle.jdbc.driver.OracleDriver"); try { // 创建连接 conn = DriverManager.getConnection( "jdbc:oracle:thin:@10.xx.xx.xx:1521:xxx", "xxx", "xxxx"); // 调用pk proc = conn .prepareCall("{call PK_NB_DATACHECK.get_po_status_code(?,?,?,?)}"); // 设置参数 proc.setString(1, "100000000000388"); proc.registerOutParameter(2, Types.VARCHAR); proc.registerOutParameter(3, Types.VARCHAR); proc.registerOutParameter(4, Types.VARCHAR); // 执行调用 proc.execute(); // 打印结果 System.out.println("保险合同号:" + proc.getString(2) + "\n" + "保单状态" + proc.getString(3) + "\n" + proc.getString(4)); // 关闭连接 if (null != proc) { proc.close(); } if (null != conn) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } catch (ClassNotFoundException e) { e.printStackTrace(); } } }二、返回参数为自定义类型,见代码:
package com.konkon.pk.call; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Types; import oracle.jdbc.OracleTypes; import oracle.sql.STRUCT; /** * CallPkObjType.java * 作用:调用pk返回自定义对象,练习时使用 * 注意事项 * * 注意: 本内容仅限于某某软件公司内部使用,禁止转发 * VERSION DATE BY CHANGE/COMMENT * 1.0 2012-3-20 YinMeng create */ public class CallPkObjType { public CallPkObjType() { } public static void main(String[] args) { Connection conn = null; CallableStatement proc = null; try { Class.forName("oracle.jdbc.driver.OracleDriver"); try { // 创建连接 conn = DriverManager.getConnection( "jdbc:oracle:thin:@10.xx.1.xx:1521:xxxx", "xx", "xxx"); // 调用自定义 proc = conn .prepareCall("{? = call PK_LIB_USRDTPROC.f99_get_usrdat(?,?)}"); // 设置参数 proc.registerOutParameter(1, Types.SMALLINT); proc.setString(2, "10000103020"); proc.registerOutParameter(3, OracleTypes.STRUCT, "OB_ACCC"); proc.execute(); STRUCT str = (STRUCT) proc.getObject(3); Object[] obj = str.getOracleAttributes(); if (null != obj) { for (int i = 0; i < obj.length; i++) { System.out.println(obj[i]); } } System.out.println(proc.getString(1)); // 关闭连接 if (null != proc) { proc.close(); } if (null != conn) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } catch (ClassNotFoundException e) { e.printStackTrace(); } } }三、返回参数为自定义类型数组,见代码:
package com.konkon.pk.call; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; import oracle.jdbc.OracleTypes; import oracle.sql.STRUCT; import vlife.plsql.Rec_bag_627m1a; import vlife.plsql.Rec_bag_627m1b; /** * CallPkTableType.java * 作用:调用pk返回自定义列表对象,练习 * 注意事项 * 注意: 本内容仅限于某某软件公司内部使用,禁止转发 * VERSION DATE BY CHANGE/COMMENT * 1.0 2012-3-20 YinMeng create */ public class CallPkTableType { public CallPkTableType() { } public static void main(String[] args) throws ParseException { Connection conn = null; CallableStatement proc = null; try { Class.forName("oracle.jdbc.driver.OracleDriver"); try { // 创建连接 conn = DriverManager.getConnection( "jdbc:oracle:thin:@xxx.xx.xxx.xxx:1521:xxx", "xx", "xxx"); // 调用自定义 proc = conn .prepareCall("{call pk_bag_bag627m.bag764m_get_agin_his_info(?,?)}"); Object[] objs = null; List<Rec_bag_627m1b> nt_rec_bag_re = null; Rec_bag_627m1a rec_bag_627m1a = new Rec_bag_627m1a(); rec_bag_627m1a.setAgin_code(null); rec_bag_627m1a.setAgin_name(null); rec_bag_627m1a.setOperator_time_e(null); rec_bag_627m1a.setManager_code(null); rec_bag_627m1a.setOperator_time_s(null); proc.setObject(1, rec_bag_627m1a); proc.registerOutParameter(2, OracleTypes.ARRAY, "NT_REC_BAG_627M1B"); proc.execute(); Object[] obj = (Object[]) proc.getArray(2).getArray(); nt_rec_bag_re = new ArrayList<Rec_bag_627m1b>(); if (null != obj) { Rec_bag_627m1b rec_b = null; Rec_bag_627m1b p_rec = null; // 格式化时间 SimpleDateFormat smf = new SimpleDateFormat("yyyy-mm-dd"); // 获取职级开始时间 java.util.Date leav_s_util = null; java.sql.Date leav_s = null; // 修改时间 java.util.Date modi_util = null; java.sql.Date modi = null; // 实例循环 for (Object rec : obj) { objs = ((STRUCT) rec).getAttributes(); if (null != objs) { // 职级开始时间数据 if (("".equals(objs[4])) || null == objs[4]) { leav_s = null; } else { leav_s_util = smf.parse(objs[4].toString()); leav_s = new java.sql.Date(leav_s_util .getTime()); } // 操作时间数据获取 if (("".equals(objs[9])) || null == objs[9]) { modi = null; } else { modi_util = smf.parse(objs[9].toString()); modi = new java.sql.Date(modi_util.getTime()); } rec_b = new Rec_bag_627m1b(); rec_b.setManagerment((String) objs[0]); rec_b.setAgincode((String) objs[1]); rec_b.setAginname((String) objs[2]); rec_b.setAginlevel((String) objs[3]); rec_b.setLevel_time_s(leav_s); rec_b.setDepart_code((String) objs[5]); rec_b.setDepart_name((String) objs[6]); rec_b.setAgin_level_name((String) objs[7]); rec_b.setModi_type((String) objs[8]); rec_b.setModi_time(modi); rec_b.setOperator_id((String) objs[10]); nt_rec_bag_re.add(rec_b); } } for (int i = 0; i < nt_rec_bag_re.size(); i++) { p_rec = nt_rec_bag_re.get(i); System.out.println(p_rec.getModi_time()); } } // 关闭连接 if (null != proc) { proc.close(); } if (null != conn) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } catch (ClassNotFoundException e) { e.printStackTrace(); } } }
注意:如果输出的参数结果中有中文,有时候会有乱码的现象,可以下载语言包(http://download.csdn.net/detail/kxcc_sx/393164#comment)并添加到环境中就可以了,我的是这样的,对于jdk版本比较低的可能还需要对应的oracle驱动包。
相关文章推荐
- 当java调用oracle的存储过程时,存储过程的返回值类型不能为boolean
- java调用存储过程(返回列表)
- Java调用存储过程返回数组
- ibatis调用存储过程:返回NUMBER,对应java类型的解决办法
- 数组、二维数组、及类型,存储过程调用.相关java
- JAVA调用ORACLE带数组输入参数和返回游标结果集的存储过程
- java 调用oracle 分页存储过程 返回游标数据集
- Java调用oracle存储过程通过游标返回临时表数据
- Oracle存储过程中执行查询返回的结果集,并使用java代码调用【转】
- java调用存储过程,返回list
- DWR中调用Java对象的方法,不要使用简单数据类型
- java 调用存储过程 传入和返回全部是自定义数组
- java 通过存储过程名字 获取存储过程的参数列表,然后自动传参调用sp
- MySQL存储过程和自定义函数、Navicat、创建存储过程和函数、调用存储过程和函数、三种方式、In和Out类型参数、
- Java 调用存储过程中传递集合类型处理方法
- java调用oracle存储过程的自定义类型(可变数组).txt
- java调用存储过程同时获取[返回参数]和[结果集]
- Java 泛型-简单泛型存储多种类型对象
- Oracle存储过程传入类似java中list、数组类型的参数并使用
- java程序调用有参存储过程返回参数