-
2020-04-11 14:52:28
//因为数据库中新增了一列basic_sort ,然后需要根据之前basic_datetime数据中的时间转为时间戳后存入新增的字段中,因为表中数据量有10万+,所以网上查了查写了个存储过程出来,测试通过,10万多条用时不到2分钟
我发现复制存储过程的时候有个坑,完整复制过去之后有的地方会报错,报错的位置照着手打一遍就可以了
1. 首先先创建一个存储过程
create procedure update_sort()
beginend
2. 提示成功之后将下面的内容放入begin 和 end之中
DECLARE basic_id VARCHAR(32);
DECLARE basic_datetime VARCHAR(32);
# 设置变量s来进行while循环
DECLARE s int DEFAULT 0;#设置consume游标,来接收查询的list的结果集
DECLARE consume CURSOR FOR SELECT a.basic_id as basic_id,a.basic_datetime as basic_datetime from basic a ;
# 当程序发生异常时将s设置为1
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET s=1;
#打开consume游标进行程序的调用
OPEN consume;
#将consume的内容赋值给basic_id,basic_datetime;
FETCH consume into basic_id,basic_datetime;
while s <> 1 DO
update basic b set b.basic_sort = UNIX_TIMESTAMP(basic_datetime) where b.basic_id = basic_id;
FETCH consume INTO basic_id,basic_datetime;
end WHILE;
CLOSE consume;更多相关内容 -
MyBatis中调用存储过程传入List集合参数的实例详解
2021-11-28 13:23:35项目中调用存储过程中传参-List类型详解前言:
方向: java - Spring MVC -MyBatis - SQL存储过程
实战目标:MyBatis调用存储过程传入List集合类型的数据进行添加操作;
案例必备小知识:
Spring MVC , MyBatis , MySQL存储过程;
实战在线:
1.List集合类型接收页面的数据:
2.集合类型预处理(将List集合类型转换为字符串类型):
3.MySQL中创建存储过程:
-- 存储过程中进行批量添加 create PROCEDURE addUserList(in arrayStr varchar(255), in delimiter varchar(255)) BEGIN declare i int default 0; set @arrayLength = 1 + (length(arrayStr) - length(REPLACE(arrayStr,delimiter,''))); while i < @arrayLength DO set i = i+1; set @result = REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(arrayStr,delimiter,i)),delimiter,1)); -- 添加语句 -- 位置截取:SUBSTRING_INDEX(SUBSTRING_INDEX(@result,',',1),',',-1) insert into d_user(uname,pwd,`status`) values (SUBSTRING_INDEX(SUBSTRING_INDEX(@result,',',1),',',-1),SUBSTRING_INDEX(SUBSTRING_INDEX(@result,',',2),',',-1),0); end while; END drop PROCEDURE addUserList -- 存储过程测验 call addUserList("小小英,123-小mei美,222","-");
4.MyBatis调用存储过程进行添加:
<insert id="addUserList" statementType="CALLABLE"> { call addUserList(#{arrayStr},#{delim}) } </insert>
小结:
1.MySQL存储过程中传入List集合类型时需要预先转化成字符串,以字符串形式传参;
2.存储过程中可以先循环数组再进行sql操作即可(注意截取);
3.存储过程中传集合类型并不常用,在做批量数据处理是可以调用处理;
4存储过程中若需要进行复杂操作是可以创建临时表,在数据表基础上操作会更方便.
声明:
此文内容已进过测试可用,若有问题请及时联系小编;
此文仅支持交流学习之用,不支持用作它途,欢迎大家交流指正;
-
Mybatis从Mysql存储过程接受List, Object>>
2022-01-14 11:21:01List<Map<String,Object>> minuteSum(@Param("tableName") String tableName,@Param("dayTime") Date dayTime); Mapper <resultMap type="java.util.HashMap" id="resultMapMinute"> <result...Dao
List<Map<String,Object>> minuteSum(@Param("tableName") String tableName,@Param("dayTime") Date dayTime);
Mapper
<resultMap type="java.util.HashMap" id="resultMapMinute"> <result column="value" property="value" javaType="java.lang.Double" jdbcType="DOUBLE"/> <result column="time" property="time" javaType="java.util.Date" jdbcType="TIMESTAMP"/> </resultMap> <select id="minuteSum" resultMap="resultMapMinute" statementType="CALLABLE"> {CALL etl_minute_sum(#{tableName,mode=IN},#{dayTime,mode=IN})} </select>
效果
-
oracle调用存储过程传递list参数
2018-05-04 14:53:41(一)jdbc连接:--第一步,创建数据库对象 CREATE OR REPLACE TYPE param_object is object( configId nvarchar2(64), evaluateScore number(18,2), ... --第二步,创建数据库list并且与数据库对象挂关系 c...(一)jdbc连接:
--第一步,创建数据库对象
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;
[java] view plain copy
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)才能对自定义对象和数组的转换,使用链接池转换不过来。如果谁使用了连接池成功了麻烦您评论下如何操作的,谢谢!
(2)oracle mybatils调用
1.Controller层:
// 读取解析Excel,并判断是否解析成功
List<String[]> list = ReadExcel.batchimport(file);
List list1 = new ArrayList<Budgetinfo>();
int size = list.size();
if(size>1){
for(int i=1;i<size;i++){
String [] obj = list.get(i);
Budgetinfo budgetinfo=new Budgetinfo();
budgetinfo.setCreaty(obj[0]); // 年份
if(!StringUtil.isEmpty(obj[1])){
budgetinfo.setCreatm(Integer.parseInt(obj[1])); // 月份
}
budgetinfo.setOneOrgname(obj[2]); // 所属组织
budgetinfo.setOneSubjectname(obj[3]); // 一级科目
budgetinfo.setTwoSubjectname(obj[4]); // 二级科目
budgetinfo.setThreeSubjectname(obj[5]); // 三级科目
budgetinfo.setFourSubjectname(obj[6]); // 四级科目
if(!"0.0".equals(obj[7])){
budgetinfo.setBudget(Double.parseDouble(obj[7])); // 预算金额
}
budgetinfo.setCreatetor(user.getStaffname()); // 创建人
list1.add(budgetinfo);
budgetinfo = null;
}
//调用存储过程
HashMap<String,Object> map = new HashMap<String,Object>();
map.put("arr",list1);res = service.importData(map);
2.dao层:
public BaseArgument importData(HashMap<String, Object> map) {
BaseArgument res=new BaseArgument();
getSqlSession().selectOne("BudgetinfoMapper.importExcelData", map);
return res;}
3.XML代码:
<parameterMap type="java.util.Map" id="inputMap">
<parameter property="arr" jdbcType="ARRAY"
javaType="java.util.List" mode="IN" typeHandler="com.ydtx.comm.ListHandler"/>
<parameter property="v_out" jdbcType="VARCHAR"
javaType="java.lang.String" mode="OUT" /></parameterMap>
<!-- 调用存储过程导入excel数据 -->
<select id="importExcelData" statementType="CALLABLE" parameterMap="inputMap">
{call sp_loaddata(?,?)}</select>
3.对传入的List集合做处理的类
package com.ydtx.comm;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import com.ydtx.bean.pojo.payBudget.Budgetinfo;
import com.ydtx.utils.StringUtil;
import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;
import oracle.sql.STRUCT;
import oracle.sql.StructDescriptor;
public class ListHandler extends BaseTypeHandler{
@SuppressWarnings("unchecked")
@Override
public void setNonNullParameter(java.sql.PreparedStatement parameterSetter, int i,
Object o, JdbcType jdbcType) throws SQLException {
Connection conn = null;
try {
if(null != o){
List<Budgetinfo> list = (ArrayList<Budgetinfo>) o;
conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.16:1521:oracle", "CWSYS", "CWSYS");
//这里必须得用大写,而且必须要引入一个包,如果不引入这个包的话字符串无法正常转换,包是:orai18n.jarARRAY array = getArray(conn, "USEROBJ", "OBJ_ARRAY", list); //USEROBJ表示数据库自定义对象, OBJ_ARRAY表示数据库自定义数组parameterSetter.setArray(i, array);
}
} catch (Exception e) {
e.printStackTrace();
} finally{
if(null != conn){
conn.close();
}
}
}
@SuppressWarnings("rawtypes")
private ARRAY getArray(Connection con,String OracleObj, String Oraclelist, List<Budgetinfo> listData) throws Exception {
ARRAY array = null;
ArrayDescriptor desc = ArrayDescriptor.createDescriptor(Oraclelist, con);
STRUCT[] structs = new STRUCT[listData.size()];
if (listData != null && listData.size() > 0){
StructDescriptor structdesc = new StructDescriptor(OracleObj, con);
for (int i = 0; i < listData.size(); i++){
Object[] result = {
listData.get(i).getCreaty(), // 年份
listData.get(i).getCreatm(), // 月份
listData.get(i).getOneOrgname(), // 所属组织
listData.get(i).getOneSubjectname(), // 一级科目
listData.get(i).getTwoSubjectname(), // 二级科目
listData.get(i).getThreeSubjectname(), // 三级科目
listData.get(i).getFourSubjectname(), // 四级科目
listData.get(i).getBudget(), // 预算金额
listData.get(i).getCreatetor()
};
structs[i] = new STRUCT(structdesc, con, result);
}
array = new ARRAY(desc, con, structs);
}else{
array = new ARRAY(desc, con, structs);
}
return array;
}
@Override
public Object getNullableResult(ResultSet rs, String columnName) throws SQLException {
// TODO Auto-generated method stub
return null;
}
@Override
public Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
// TODO Auto-generated method stub
return null;
}
@Override
public Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
// TODO Auto-generated method stub
return null;
}
}
-
Java执行Oracle存储过程并接收返回值
2021-05-08 12:36:48Java执行Oracle存储过程并接收多个返回值(集合/数值)Java代码:package com.pure.util;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;... -
Mybatis--调用存储过程、接收存储过程返回的多结果集以及出参参数接收
2020-06-03 14:51:45接收存储过程返回的多个结果集 Exam表结构 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for exam -- ---------------------------- DROP TABLE IF ... -
spring boot mybatis 注解调用存储过程,接收游标返回数据集
2018-03-28 16:10:32@Select("call pro_work_order_item( #{mastId,mode=IN,jdbcType=NUMERIC}," + " #{pPage,mode=IN,jdbcType=NUMERIC}," + " #{pCount,... -
Java调用带参数的存储过程并返回集合
2015-05-06 10:16:21Java调用带参数的Oracle 存储过程并返回集合, -
List作为泛型参数实现可接收存储任意类型的List对象
2021-03-09 01:09:45原文链接:https://blog.csdn.net/eeeeasy/article/details/80999650?utm_source=blogxgwz2在项目中遇到一个问题,想要封装一个通用的可接收任意类型的List对象的方法,最开始以为很容易实现,通过List就可接收任意... -
navicate创建mysql存储过程,遍历list查询集合,执行业务逻辑
2020-07-21 16:08:34navicate创建mysql存储过程,同时需要对存储过程中的查询list结果集进行遍历,获取相应的结果参数执行其他的业务逻辑; 存储过程可定义事件定时器,定时执行函数,具体操作可见另一篇博文:navicate创建mysql存储... -
存储过程的导入List集合
2017-08-09 11:02:44这个存储过程在package中,以下是包中的详细代码,下面的代码包含伪代码,请结合实际进行参考 object的创建代码: craate or repalce type tanglei_lianxi_obj is object( -- 列名 id number, name varchar, ... -
mybatis调用Oracle存储过程,并接收返回值(游标类型)
2018-04-03 17:22:40初次学习存储过程调用,写得不是很好,有不对的地方大家多多指教,希望能对您有所帮助。1.普通返回值:Oracle存储过程:/*测试用存储过程*/create or replace procedure p_test(v_slid in varchar2,v_sm out varchar... -
oracle存储过程接收 自定义 table 数组类型参数
2018-12-26 16:12:58oracle存储过程接收自定义数组类型参数 2016年10月29日 09:53:23 ntuloser 阅读数:1092 标签: oraclejava存储mybatis 更多 个人分类: 数据库 版权声明:本文为博主原创文章,未经博主允许不得转载。 ... -
JAVA执行存储过程接收返回值
2014-04-09 11:31:44List result = new ArrayList();//接收值所用的列表 Connection conn = DAOFactory.getDAOFactory().getConnection();//根据项目情况打开连接(这里只是我项目的打开方式) CallableStatement statement = conn.... -
springboot接口接收list类型入参无数据,@RequestBody无法映射List数据
2021-11-01 11:18:23实体类中有个List存储其他实体类,想通过@RequestBody进行同步的,但老是同步不了 关于@RequestBody同步List类型等其他类型入参为null问题解决办法: 1.查看是否使用@Data的getset方法,由于lombook生成的getset方法... -
java spring项目controller中接收一个string,和一个List为入参报错
2021-04-24 02:11:01只接收一个List作为入参的话不报错,下方为代码:前台:$.ajax({type:"post",url: 'add',contentType:"application/json; charset=utf-8",dataType:"json",data:JSON.stringify([{id:1,name:"hello"},{id:2,name:... -
Mysql存储过程调用
2021-01-19 00:34:071.1create procedure (创建)create procedure存储过程名 (参数列表)beginsql语句代码块end注意:由括号包围的参数列必须总是存在。如果没有参数,也该使用一个空参数列()。每个参数默认都是一个in参数。要指定为其它... -
MyBatis(三) java 接收存储过程返回的多个结果集以及相应的处理
2018-07-18 13:38:12使用存储过程查询数据库,返回了多个结果集,需要使用java接收和处理。并且展示到前端页面 二.环境: springboot+mybatis 数据库:sqlServer 三.解决过程: 存储过程: <!--返回结果集的配置--> <... -
oracle存储过程接收自定义数组类型参数
2016-10-29 09:53:23在使用oracle进行批量插入的时,如果数据量较小可以使用install all的语法进行批量插入。... 使用存储过程批量插入很显然要接收一个数组当参数,而且这个数组里的元素类型应该和java里自定义的数据模型对应。 -
java如何将一个List传入Oracle存储过程
2015-07-16 14:16:16java如何将一个List传入Oracle存储过程,例子如下: 数据库端建一个PL/SQL的数组。 CREATE OR REPLACE TYPE tables_array AS VARRAY(100) OF VARCHAR2(32) ; drop table test purge; create table test ( name ... -
java使用mybatis 调用存储过程返回一个游标结果集
2022-03-25 16:52:14mybatis调用存储过程返回游标接收结果集。 详细信息 1.service实现类 @Override @Transactional public List<HighgoFunOneRefcursorEntity> getOneRefcursor(Integer id) { HashMap<S -
存储过程处理json数据
2021-05-05 09:48:24后台对象集合转换为json数据作为存储过程的入参,处理方式如下:create or replace procedure SP_KHZBDFB_UPDATE(p_json IN VARCHAR2, --传入的json串p_code OUT NUMBER, --结果代码p_message OUT VARCHAR2) is --... -
oracle存储过程如何返回list,并用jdbc调用
2015-09-16 15:58:02oracle没有直接的返回List的方法,这里需要有包定义一个Cursor(游标)的返回类型。下面是我在计算收益率的一段代码,只做参考。 oracle包的写法如下: CREATE OR REPLACE PACKAGE CAL_RTN_PACK IS ... -
List接收或返回多种List参数类型
2019-07-23 18:34:31List<?>范型,范型通配符的使用<?>,`?`是类型实参,而不是类型形参,此处的`?`和Number、String、Integer一样都...一般作为参数来接收外部集合,或者返回一个具体元素类型的集合。 一个应用例子: publ... -
springboot前端向后端传递复杂对象如list set的接收问题
2020-12-23 01:38:39list类型的参数,接收前台的数组值,实验了一下,结果还真可以。不用绑定到对象里面。当然我这个是前台传递了个包含的是string的数组到后台,然后,后台用list来接收。具体如下:前台代码://发送请求到后台,带数组... -
SpringMVC用List接收请求参数
2018-11-26 22:13:12list类型的参数,接收前台的数组值,实验了一下,结果还真可以。 不用绑定到对象里面。 当然我这个是前台传递了个包含的是string的数组到后台,然后,后台用list来接收。 具体如下: 前台代码: //发送请求到后台...