Oracle存储过程传入List<object>参数

14人阅读 评论(0) 收藏 举报
分类:
--第一步,创建数据库对象
CREATE OR REPLACE TYPE param_object is object(
  configId nvarchar2(64),
  evaluateScore number(18,2),
  evaluateLevel nvarchar2(64)
); 


--第二步,创建数据库list并且与数据库对象挂关系
create type param_array as table of param_object;


--第三步,创建存储过程将list<object>
create or replace procedure PRO_UPDATE_EVALUATE_SCORE(paramList in param_array,
                                                      result_id out varchar2) is
begin
  for i in 1 .. paramList.count loop
    update SCM_TEST
       set CONFIGID      = paramList(i).configId,
           EVALUATESCORE = paramList(i).evaluateScore where
           EVALUATELEVEL = paramList(i).evaluateLevel;
           result_id := i;
  end loop;
  commit;
end PRO_UPDATE_EVALUATE_SCORE;


package com.atguigu.springdata.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Date;
import com.sun.org.apache.xerces.internal.impl.dtd.models.DFAContentModel;

import oracle.jdbc.OracleCallableStatement;
import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;
import oracle.sql.STRUCT;
import oracle.sql.StructDescriptor;

public class Tesst {
	// 数据库连接
	private static final String connectionURL = "jdbc:oracle:thin:@127.0.0.1:1521/oracle11g";
	private static final String userID = "oracle11g";
	private static final String userPassword = "oracle11g";
	private static final String driver_class = "oracle.jdbc.driver.OracleDriver";

	public void runTest() {
		//组装需要的参数List<String[]> String[] length 要和数据库的自定对象PARAM_OBJECT个数一样
		String chars = "abcdefghijklmnopqrstuvwxyz";
		ArrayList list = new ArrayList<>();
		for(int i=0;i<2000;i++){
			String c = chars.charAt((int)(Math.random() * 26))+"";
			String[] values = { i + 1 + "", i + 1 + "",c.toUpperCase()};
			list.add(values);
		}
		   
		   
		Connection con = null;
		OracleCallableStatement stmt = null;
		try {
			Class.forName(driver_class).newInstance();
			con = DriverManager.getConnection(connectionURL, userID,
					userPassword);
			
			ARRAY aArray = getArray(con, "PARAM_OBJECT","PARAM_ARRAY", list,11);
			
			System.out.println("开始时间:"+  new Date());
			stmt = (OracleCallableStatement) con.prepareCall("{call PRO_UPDATE_EVALUATE_SCORE(?,?)}");
			
			stmt.setARRAY(1, aArray);
//			stmt.setArray(1, aArray);
			stmt.registerOutParameter(2, Types.VARCHAR);
			
			stmt.execute();
			String string = stmt.getString(2);
			System.out.println("结束时间:"+  new Date());
			System.out.println("输出参数:"+string);
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (stmt != null) {
				try {
					stmt.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			if (con != null) {
				try {
					con.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
	}

	/**
	 * 将java数组转换成数据库数组
	 * @param con			原生jdbc链接,链接池的链接不行
	 * @param OracleObj		数据库自定义对象
	 * @param Oraclelist	数据库自定义数组
	 * @param objlist		需要的参数
	 * @param paramNum		自定义对象的个数
	 * @return	
	 * @throws Exception
	 */
	private ARRAY getArray(Connection con, String OracleObj,

	String Oraclelist, ArrayList objlist,int paramNum) throws Exception {

		ARRAY list = null;


		if (objlist != null && objlist.size() > 0) {

			StructDescriptor structdesc = StructDescriptor.createDescriptor(OracleObj,con);
			
			STRUCT[] structs = new STRUCT[objlist.size()];

			Object[] result = new Object[0];

			for (int i = 0; i < objlist.size(); i++) {
				Object[] object = (Object[]) objlist.get(i);
				String[] str = (String[]) objlist.get(i);
				
				result = new Object[paramNum];

				// 数组大小应和你定义的数据库对象(AOBJECT)的属性的个数
				for(int j=0;j<paramNum;j++){
					result[j] = str[j];
				}

				// 将list中元素的数据传入result数组 result[1] = new Integer(..); //
				structs[i] = new STRUCT(structdesc, con, result);
			}

			ArrayDescriptor desc = ArrayDescriptor.createDescriptor(Oraclelist,
					con);

			list = new ARRAY(desc, con, structs);
		}


		return list;

	}

	public static void main(String[] args) {
		Tesst testListToProcedure = new Tesst();
		testListToProcedure.runTest();
	}

}

注:自定义对象里面的字符必须要使用nvarchar2,不然java代码将字符串的格式封装不进去。链接要使用jdbc原生链接(Connection)才能对自定义对象和数组的转换,使用链接池转换不过来。如果谁使用了连接池成功了麻烦您评论下如何操作的,谢谢!

查看评论

oracle存储过程,批量创建表和数据

  • 2010年06月24日 23:31
  • 2KB
  • 下载

Oracle中把Array类型作为参数传入存储过程示例

Oracle中把Array类型作为参数传入存储过程并用Java对其进行调用的示例是本文我们主要要介绍的内容,接下来我们就开始介绍这一过程……   Oracle中把Array类...
  • ytlizhen1
  • ytlizhen1
  • 2013-02-26 21:05:53
  • 1455

List&lt;object&gt;排序

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; ...
  • RSS_40728440
  • RSS_40728440
  • 2018-01-12 17:01:05
  • 153

Oracle存储过程传入类似java中list、数组类型的参数并使用

1. CREATE OR REPLACE TYPE CDW_OBJECT AS OBJECT(     lablename                 nVARCHAR2(50),    l ...
  • blogzlh
  • blogzlh
  • 2014-11-20 12:18:45
  • 3550

Excel导出工具类

  • 2018年03月08日 14:21
  • 8KB
  • 下载

list&lt;object&gt; 与List&lt;Sting[]&gt;打回前台

返回前台是对象用数组的形式拿出 ===========================list============================ ===只要后台传的是对象不管是单个还是list,...
  • y666666y
  • y666666y
  • 2017-04-17 15:15:23
  • 135

Mybatis传list参数调用oracle存储过程

怎么利用MyBatis传List类型参数到数据库存储过程中实现批量插入数据? MyBatis中参数是List类型时怎么处理?大家都知道MyBatis批处理大量数据是很难做到事务回滚的(事务由Spr...
  • s592652578
  • s592652578
  • 2016-03-03 18:36:17
  • 47072

mybatis调用oracle存储过程传入list参数代码

  • 2017年10月13日 17:29
  • 4.32MB
  • 下载

将Java List 传入到Oracle DB的存储过程

http://progress.iteye.com/blog/438707 一 : Oracle代码 create table T_list_test ( list_test_id...
  • qq804702802
  • qq804702802
  • 2015-12-18 11:22:42
  • 404

java调用oracle存储过程传入参数为数组的处理

java调用参数为数组的存储过程,主要是能正确的把java的数组类型转化为oracle能识别的的数组类型,这一步网上的例子很多,也就不多说了。在最初做这个的时候发现,当传入数字数组的时候,数组里的值能...
  • wsm106
  • wsm106
  • 2011-03-03 18:53:00
  • 3034
    个人资料
    持之以恒
    等级:
    访问量: 5万+
    积分: 1152
    排名: 4万+
    最新评论