Java调用存储过程(返回:简单类型、自定义对象、列表数组)

由于公司使用的Jdevelope进行开发,有一套已经封装好的框架,因此调用存储过程非常简单,小弟今天突然想着能不能使用jdbc自主调用下下存储过程,包括各种返回类型,在参考网上的现有代码研究了两个下午之后,写了三个东西,也算是总结吧。

一、返回参数为简单类型,见代码:

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 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();

				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驱动包。


你可能感兴趣的:(存储过程)